본문 바로가기

tensorflow

2. 텐써플로우 단층신경망 구성

728x90
반응형

텐서플로우 용어 설명

 

1. 오퍼레이션(Operation)

그래프 상의 노드는 오퍼레이션(줄임말 op) 불린다.

오퍼레이션은 하나 이상의 텐서를 받을 있다.

오퍼레이션은 계산을 수행하고, 결과를 하나 이상의 텐서로 반환 있다.

 

 

 

 

 

2. 텐써(Tensor)

내부적으로 모든 데이터는 텐써를 통해 표현된다.

텐써는 일종의 다차원 배열인데, 그래프 내의 오퍼레이션간에

텐써가 전달된다.

 

 

 

 

3. 세션(Session)

그래프를 실행하기 위해서는 세션 객체가 필요하다.

세션은 오퍼레이션의 실행환경을 캡슐화 것이다.

 

 

모델을 생성하는 부분 <-- 그래프를 그리는 부분

-오퍼레이션

-변수

-----------------------------------

모델을 실행하는 부분 <-- 만들어진 그래프에 데이터를 주입하는 부분

-세션

 

 

 

 

4. 변수(Variable)

변수는 그래프의 실행 , 파라미터를 지정하고 갱신하는데 사용된다.

메모리상에서 텐서를 저장하는 버퍼 역할을 한다.

 

 

 

예제:

import tensorflow as tf

 

sess = tf.Session()  #그래프를 실행 할 세션을 구성한다

hello = tf.constant("Hello, Tensorflow")

 

print(sess.run(hello))

 

b'Hello, Tensorflow'

바이너리

 

파이썬 3버젼은 문자열 unicode 기본이므로 str에서

encoding 처리를 해줘야 binary 타입을 unicode 타입으로 반환한다.

 

바이너리 나오게 하려면

print(str(sess.run(hello), encoding='utf-8') )

Hello, Tensorflow

 

 

sess = tf.Session()  #그래프를 실행 할 세션을 구성한다

hello = tf.constant("Hello, Tensorflow")

변수를 정의하는 영역

-------------------------------------------------------------------------------

변수를 실행하는 영역

위에서 변수를 정의했지만, 실행은 정의한 시점에서 실행되는 것은 아니다.

session 객체와 run 메소드를 사용할 계산이 되어 실행된다.

print(sess.run(hello))

print(str(sess.run(hello), encoding='utf-8') )

Hello, Tensorflow

 

 

 

 

텐써 플로우 기본 실습 두번째 예제

 

import tensorflow as tf 

x = tf.constant(35, name= 'x')  

# x라는 상수값을 만들고  (constant: 상수 발생)

# 숫자 35를 지정

 

y = tf.Variable(x + 5, name= 'y')

# y 라는 변수를 만들고

# 방정식 x+5 로 정의함

 

model = tf.global_variables_initializer()

# global_variable_initializer() 변수를 초기화 하겠다.

# 그래프를 그리는 영역(빌딩building 영역)

#---------------------------------------------------

#그래프를 실행하는 영역

sess = tf.Session()   #그래프를 실행할 세션을 구성한다

#오라클에서 scott 접속하는것과 같이 늘 실행시켜줘야 하는 것이다.

 

sess.run(model) # 변수를 초기화하는 model 실행!

 

print(sess.run(y))

 

 

 

 

텐써플로우 세번째 예제

import tensorflow as tf

 

a = tf.constant(10)

b = tf.constant(32)

c = tf.add(a,b)

print(c)

 

 

 

문제1. 세번째 예제를 가지고 텐써 그래프를 실행하시오

import tensorflow as tf

 

a = tf.constant(10)

b = tf.constant(32)

c = tf.add(a,b)

 

#model = tf.global_variables_initializer() 굳이 안써도 . Variable 일때만 쓰면 .

sess = tf.Session()

sess.run(model)

 

print(sess.run(c))

sess.close()

42

 

 

 

문제2. 아래의 모델(그래프) 실행하시오

(위의 Session 그래프 선언한걸 계속 끌어와서 쓴다.)

 

import tensorflow as tf

a = tf.add(1,2)

b = tf.multiply(a,3)

c = tf.add(b,5)

d = tf.multiply(c,6)

e = tf.multiply(d,5)

f = tf.div(e,6)

g = tf.add(f,d)

h = tf.multiply(g,f)

 

print(sess.run(h))

sess.close()

10780

 

 

 

 

문제3. 위의 예제를 with 사용해서 구현하시오

 

import tensorflow as tf

a = tf.add(1,2)

b = tf.multiply(a,3)

c = tf.add(b,5)

d = tf.multiply(c,6)

e = tf.multiply(d,5)

f = tf.div(e,6)

g = tf.add(f,d)

h = tf.multiply(g,f)

 

print(sess.run(h))

sess.close()  #  <== 세션을 닫는 구문을 작성해줘야 한다.(안그러면 오류남)

 

with 절을 사용하면 close() 써도 된다.

 

import tensorflow as tf

a = tf.add(1,2)

b = tf.multiply(a,3)

c = tf.add(b,5)

d = tf.multiply(c,6)

e = tf.multiply(d,5)

f = tf.div(e,6)

g = tf.add(f,d)

h = tf.multiply(g,f)

 

with tf.Session() as sess:

    #model = tf.global_variables_initializer()

    #sess = tf.Session()     with절에서 선언했는데 굳이 .

    #sess.run(model)

    print(sess.run(h))

   

   

 

 

파이썬 기본문법과 텐써 플로우 기본 문법을 비교

1에서 5까지의 숫자를 출력한다

-파이썬 기본 문법

for i in range(1,5+1):

print(i)

 

-텐써플로우

import tensorflow as tf

x = tf.Variable(0)

init = tf.global_variables_initializer()

 

with tf.Session() as sess:

    sess.run(init)

    for i in range(5):       

        x = x+1

        print(sess.run(x))

 

 

또는

import tensorflow as tf

with tf.Session() as sess:   

    for i in range(6):

        print( sess.run( tf.constant(i) ) )

*이때 tf.constant 없이 i 갖다쓰면 텐써가 스스로 convert 못한다고

에러메시지가 뜬다. 그래서 tf.constant 써줘야 한다.

 

 

============with 없이 쓴거

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

import tensorflow as tf

x = tf.Variable(0)

init = tf.global_variables_initializer()

 

sess = tf.Session()

sess.run(init)

for i in range(5):       

    x = x+1

    print(sess.run(x))

sess.close()

변수생성했으면 무조건 초기화해야 돌아간다.(셋트임! )

 

 

 

 

 

문제4. 위의 코드를 이용해서 구구단 2단을 출력하시오

 

import tensorflow as tf

 

sess = tf.Session()

for i in range(1,10):

    y = i

    x = tf.multiply(2, y, name='x')

    print('2 x',i,'='+str(sess.run(x)))

 

sess.close()

 

=============the other

import tensorflow as tf

#init = tf.global_variables_initializer()

 

with tf.Session() as sess:

    for i in range(1,10):

        y = i

        x = tf.multiply(2 , y , name = 'x')

        print(sess.run(x))

==================

import tensorflow as tf

with tf.Session() as sess:

    x = tf.Variable(2)

    init = tf.global_variables_initializer()

    sess.run(init)

    for i in range(1,10):

        y = i

        z = tf.multiply(x,y)

        print(sess.run(x) ,'x',y,'=', sess.run(z))

***

X z 처럼 Variable, multiply  함수를 적용시킨 변수들은

Sess.run() 으로 실행시켜줘야 한다.

I y 굳이 선언 안하고 사용해도 무방하다.

 

   

import tensorflow as tf

with tf.Session() as sess:

    x = tf.Variable(2)

    init = tf.global_variables_initializer()

    sess.run(init)

    for i in range(1,10):

        #y = i

        z = tf.multiply(x,i)

        print(sess.run(x) ,'x',i,'=', sess.run(z))`

 

 

 

문제5. 구구단 2단에서 9단까지 출력하시오

 

import tensorflow as tf

with tf.Session() as sess:

    for i in range(2,10):       

        for j in range(1,10):

            x = i

            y = j

            z = tf.multiply(x , y , name = 'z')

            print(str(i)+'x'+str(j)+'='+str( sess.run(z) ) )

       

   

=========================

import tensorflow as tf

 

x = tf.Variable(0)

y = tf.Variable(0)

z = tf.multiply(x,y)

init = tf.global_variables_initializer()

 

sess = tf.Session()

sess.run(init)

 

for i in range(2,10):   

    for j in range(1,10):       

        print( i,"x",j," = ",sess.run(z, feed_dict = {x:i, y:j} ))

sess.close()

=================================

import tensorflow as tf

with tf.Session() as sess:

    x = tf.Variable(1)

    init = tf.global_variables_initializer()

    sess.run(init)

    for i in range(1,10):

        x = tf.add(x,1)

        for i in range(1,10):

            #y = i

            z = tf.multiply(x,i)

            print(sess.run(x) ,'x',i,'=', sess.run(z))

 

 

 

 

문제6. (점심시간문제)

아래의 텐써 그래프를 실행하시오

숫자는 알아서 feed 하시오.

 

import tensorflow as tf

a = tf.placeholder('float')

b = tf.placeholder('float')

 

y = tf.multiply(a,b)

z = tf.add(y,y)

init = tf.global_variables_initializer()

sess = tf.Session()

sess.run(init)

 

for i in range(2,10):

    for j in range(1,10):

        print(sess.run(z, feed_dict = {a:i, b:j} ))       

sess.close()

 

 

 

 

numpy tensorflow 문법 비교

 

문제7. zero 숫자 1 채워넣는 배열을 생성하시오

1.numpy

import numpy as np

a = np.zeros((2,2))

b = np.ones((2,2))

print(a)

print(b)

 

 

2. tensorflow

import tensorflow as tf

a = tf.zeros((2,2))

b = tf.ones((2,2))

sess = tf.Session()

print(sess.run(a))

print(sess.run(b))

sess.close()

[[0. 0.]

 [0. 0.]]

[[1. 1.]

 [1. 1.]]

 

 

 

문제8. 아래의 numpy 문법을 텐써플로우로 구현하시오

1. numpy

import numpy as np

a = np.array([0,0,0,1,0,0,0,0,0,0])

print( np.argmax( a, axis=0) )

 

2. tensorflow

import numpy as np

import tensorflow as tf

a = np.array([0,0,0,1,0,0,0,0,0,0])

b = tf.argmax(a, axis=0)

sess = tf.Session()

print(sess.run(b))

sess.close()

 

  

 

import tensorflow as tf

import numpy as np

 

with tf.Session() as sess:

    a = np.array([0,0,0,1,0,0,0,0,0,0])

    b = tf.argmax(a, axis = 0)

    print(sess.run(b))

   

: 3 (위치를 알려주는 )

 

 

       

 

문제9. 아래의 numpy 문법을 텐써 플로우로 구현하시오

1. numpy

 

import  tensorflow  as  tf

import  numpy  as  np

 

a = np.array([[[1, 2, 3],

               [2, 1, 4],

               [5, 2, 1],

               [6, 3, 2]],

              [[5, 1, 3],

               [1, 3, 4],

               [4, 2, 6],

               [3, 9, 3]],

              [[4, 5, 6],

               [7, 4, 3],

               [2, 1, 5],

               [4, 3, 1]]])

 

print  ( np.sum( a, axis = 0) )

 

[[10  8 12]

 [10  8 11]

 [11  5 12]

 [13 15  6]]

 

 

 

2. tensorflow

import numpy as np

import tensorflow as tf

 

a = np.array(

      [[[1, 2, 3],

           [2, 1, 4],

           [5, 2, 1],

           [6, 3, 2]],

          [[5, 1, 3],

           [1, 3, 4],

           [4, 2, 6],

           [3, 9, 3]],

          [[4, 5, 6],

           [7, 4, 3],

           [2, 1, 5],

           [4, 3, 1]]])

 

#print  ( np.sum( a, axis = 0) )

sess = tf.Session()

a = tf.reduce_sum(a, reduction_indices=[0] )

# axis = 0 해도 나옴 !

print(sess.run(a))

[[10  8 12]

 [10  8 11]

 [11  5 12]

 [13 15  6]]

 

또는

import tensorflow as tf

a = tf.Variable([[[1, 2, 3],

           [2, 1, 4],

           [5, 2, 1],

           [6, 3, 2]],

          [[5, 1, 3],

           [1, 3, 4],

           [4, 2, 6],

           [3, 9, 3]],

          [[4, 5, 6],

           [7, 4, 3],

           [2, 1, 5],

           [4, 3, 1]]] )

model = tf.global_variables_initializer()

 

with tf.Session() as sess:

    sess.run(model)

    a = tf.reduce_sum(a, reduction_indices=[0])

    print(sess.run(a))

 

 

 

 

문제10. 아래의 numpy 문법을 tensorflow 구현하시오

 

1. numpy

import numpy as np

import tensorflow as tf

 

a = np.array([i for i in range(144)])

b = a.reshape(12,12)

print(b.shape)

 

 

2. tensorflow

import numpy as np

import tensorflow as tf

 

a = np.array([i for i in range(144)])

b = tf.reshape(a ,(12,12))

 

sess = tf.Session()

print(sess.run(b))

print(b.get_shape())  #(12, 12)

sess.close()

========================

import tensorflow as tf

import numpy as np

 

with tf.Session() as sess:

    a =  np.array( [i for i in range(144)]  )

    b = tf.reshape(a,(12,12))   

    print(sess.run(b))

    print(b.get_shape() )

 

[[  0   1   2   3   4   5   6   7   8   9  10  11]

 [ 12  13  14  15  16  17  18  19  20  21  22  23]

 [ 24  25  26  27  28  29  30  31  32  33  34  35]

 [ 36  37  38  39  40  41  42  43  44  45  46  47]

 [ 48  49  50  51  52  53  54  55  56  57  58  59]

 [ 60  61  62  63  64  65  66  67  68  69  70  71]

 [ 72  73  74  75  76  77  78  79  80  81  82  83]

 [ 84  85  86  87  88  89  90  91  92  93  94  95]

 [ 96  97  98  99 100 101 102 103 104 105 106 107]

 [108 109 110 111 112 113 114 115 116 117 118 119]

 [120 121 122 123 124 125 126 127 128 129 130 131]

 [132 133 134 135 136 137 138 139 140 141 142 143]]

 

(12, 12)

 

 

 

 

 

문제11. (텐써플로우로 구현한 단층 신경망 이해에 중요 문법)

아래의 numpy 배열의 열단위 sum 출력하시오

 

1. numpy

import numpy as np

import tensorflow as tf

 

x = np.arange(6).reshape(2,3)

 

print(x)

print ( np.sum(x, axis=0))

 

[[0 1 2]

 [3 4 5]]

 

[3 5 7]

 

 

2. tensorflow

import numpy as np

import tensorflow as tf

 

x = np.arange(6).reshape(2,3)

b = tf.reduce_sum(x,reduction_indices=[0])

 

# reduction_indices=[0]   ( = )  axis=0

 

sess = tf.Session()

print(sess.run(b))

[3 5 7]

 

 

 

 

문제12.(텐써플로우로 구현한 단층 신경망 이해에 중요 문법)

아래 행렬의 결과를 텐써플로우로 구현하시오

 

0 0 0   +   1 1 1  

0 0 0        1 1 1

 

import numpy as np

import tensorflow as tf

 

x = np.zeros([2,3])

y = np.ones([2,3])

 

b = tf.add(x,y)

 

sess = tf.Session()

print(sess.run(b))

 

 

 

문제13. 아래의 행렬의 내적을 tensorflow 구현하시오

2 2 2    3 3

2 2 2         3  3  =  ?

           3 3

 

(2,3)     (3,2)     (2,2)

 

 

import numpy as np

import tensorflow as tf

 

x = np.zeros([2,3])

y = np.zeros([3,2])

x = x+2

y = y+3

 

b = tf.matmul(x,y)

 

sess = tf.Session()

print(sess.run(b))

[[18. 18.]

 [18. 18.]]

 

======또다른

import tensorflow as tf

x = tf.placeholder("float", [2,3])   # 아래 feed_dict 에서 행렬형태 잡아줘서

#굳이 [2,3] 써줘도 .

# 나중에 for 돌려서 100배치를 600 돌려야 하니까

# [None, 784] 쓰고자 지금 이렇게 가르쳐주심.

y = tf.placeholder("float", [3,2])

#model = tf.global_variables_initializer()

result = tf.matmul(x,y)

 

sess = tf.Session()

print(sess.run(result, feed_dict = {x:[[2,2,2],[2,2,2]], y:[[3,3],[3,3],[3,3]] }))

sess.close()

 

 

===또또다른

 

import tensorflow as tf

import numpy as np

 

x = tf.placeholder("float")

y = tf.placeholder("float")

#model = tf.global_variables_initializer()

result = tf.matmul(x,y)

 

sess = tf.Session()

print(sess.run(result, feed_dict = {x:np.zeros([2,3])+2, y:np.zeros([3,2])+3 }))

sess.close()

 

 

 

설명

x = tf.constant(10)                   상수값

x = tf.Variable(0)                     변수

x = tf.placeholder( "float" )        실수가 들어가는 빈깡통

x = tf.placeholder( "float",[2,3] )  23열이 실수가 들어가는 빈깡통

 

:

x = tf.placeholder(tf.float32, [ None, 32, 32, 3] )

# 4차원 행렬을 담을 구조를 만든

 

W1 = tf.Variable( tf.random_normal( [3,3,3,32] )

# 랜덤으로 생성된 값을 4차원 행렬을 만들어서 W1 저장

 

 

 

 

문제14.(텐써플로우의 cast 함수 이해)

아래의 배열의 True 1 변경하고 False 0으로 변경하시오

 

import tensorflow as tf

 

correct_prediction = [ True, False , True  ,True  ,True  ,True  ,True,  True  ,True  ,True  ,True  ,True

  ,True  ,True  ,True, False , True  ,True, False , True  ,True  ,True  ,True  ,True

  ,True  ,True  ,True  ,True  ,True  ,True  ,True  ,True  ,True  ,True  ,True  ,True

  ,True  ,True  ,True  ,True  ,True  ,True  ,True  ,True  ,True  ,True  ,True  ,True,

  True  ,True  ,True  ,True  ,True  ,True  ,True  ,True  ,True  ,True  ,True  ,True

  ,True  ,True  ,True  ,True  ,True  ,True ,False , True  ,True  ,True  ,True  ,True

  ,True  ,True, False , True, False , True  ,True  ,True  ,True  ,True  ,True  ,True

  ,True  ,True  ,True  ,True  ,True  ,True  ,True  ,True  ,True  ,True  ,True  ,True

 ,False , True  ,True  ,True]

 

a = tf.cast(correct_prediction, "float")

#cast True 1, False 0으로 바꿔준다.

sess = tf.Session()

print(sess.run(a))

 

 

 

문제15. 위의 출력된 결과에서 전체 갯수중에 1 몇개나 되는지

, 정확도를 출력하시오

전부 더해서 전체 갯수로 나눈값을 아래와 같이 출력하시오

 

결과: 0.93

a = tf.cast(correct_prediction, "float")

#cast True 1, False 0으로 바꿔준다.

b = tf.reduce_mean(a)

sess = tf.Session()

print(sess.run(b))

 

*전체 100개중 1 93 있음.

 

 

 

 

mnist  데이터로 단층 신경망 구현하기

 

문제16. 텐써플로우에 기본적으로 내장되어 있는 mnist 데이터를

가져오시오

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

import matplotlib.pyplot as plt

import numpy as np

 

mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

 

batch_xs, batch_ys = mnist.train.next_batch(100)

 

print(batch_xs.shape)

print(batch_ys.shape)

print(batch_ys)  #원핫인코딩한게 100 나옴.

 

 

 

 

문제17.

위의 mnist 데이터중에 train 데이터의 레벨을 one hot encoding 하지말고

숫자로 100개의 라벨을 가져오시오

mnist = input_data.read_data_sets("MNIST_data", one_hot=False)

print(batch_xs.shape)

print(batch_ys.shape)

print(batch_ys) #각각의 숫자값이 100 나옴

 

(100, 784)

(100,)

[9 6 1 2 9 9 2 8 1 7 6 5 9 1 5 8 9 4 2 8 8 1 8 4 2 9 8 3 0 8 0 5 8 6 0 4 5

 1 0 6 4 6 8 2 9 5 6 5 8 5 1 1 4 0 7 3 4 9 6 2 9 7 1 9 8 5 6 2 9 9 5 2 7 7

 7 3 7 9 0 2 8 8 9 0 4 1 7 3 2 5 6 9 1 4 4 6 7 4 5 4]

 

 

 

 

문제18.

이번에는 test 데이터와 test 데이터의 라벨을 100개를 가져오는데

shape 출력하시오

 

*설명:

mnist 데이터를 훈련 데이터 6만장과 테스트 데이터 1만장으로 구성되어있음

 

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

import matplotlib.pyplot as plt

import numpy as np

 

mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

 

batch_xs, batch_ys = mnist.test.next_batch(100)

 

print(batch_xs.shape)

print(batch_ys.shape)

(100, 784)

(100, 10)

 

 

 

 

문제19. 숫자 2 채워진 행렬 2x3 행렬을 텐써플로우로 출력하시오

import tensorflow as tf

import numpy as np

a = np.zeros((2,3))+2

 

b = tf.placeholder("float", [2,3])

sess = tf.Session()

print(sess.run(b, feed_dict={b : a}))

[[2. 2. 2.]

 [2. 2. 2.]]

 

placeholder [2,3] 2 None 으로 바꿔서 실행하시오

b = tf.placeholder("float", [None,3])

 

*이것도 가능

b = tf.placeholder("float", a.shape )

 

 

 

 

문제20. Mnist 데이터 784(28x28)개에 맞춰서

x 변수를 placeholder 선언하고 배치로 입력 데이터의 갯수는

개이든 상관없게 None 으로 변수를 만들고 Mnist 데이터를

x변수에 100개를 담고 출력해 보시오

 

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

import matplotlib.pyplot as plt

import numpy as np

 

mnist = input_data.read_data_sets("MNIST_data", one_hot=False)

 

batch_xs, batch_ys = mnist.train.next_batch(100)

 

x = tf.placeholder("float", batch_xs.shape)

#선생님은 ( "float", [None, 784] )

sess = tf.Session()

print(sess.run(x, feed_dict = {x:batch_xs}).shape)

나중에

for i in range(100):

for j in batch_xs:

이런식으로 for문을 반복시킬거라서 행렬의 행값이 shape보다 늘어난다.

그래서 행을 None 값으로 준다.

 

 

문제21. 위의 코드를 수정해서 훈련 데이터 100 뿐만 아니라

훈련데이터 라벨 100개도 출력되게끔 코드를 추가하시오

 

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

import matplotlib.pyplot as plt

import numpy as np

 

mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

 

batch_xs, batch_ys = mnist.train.next_batch(100)

 

x = tf.placeholder("float", batch_xs.shape)   # 100, 784

y = tf.placeholder("float", batch_ys.shape)   # 100, 10

sess = tf.Session()

print(sess.run(x, feed_dict = {x:batch_xs}).shape)

print(sess.run(y, feed_dict = {y:batch_ys}).shape)

 

**sess.run(x,y,  feed_dict = {x:batch_xs, y:batch_ys} ) 안됩니다.

feed_dict 하나의 변수에만 담을 있게끔 해주기 때문입니다.

 

 

 

 

 

문제22.(텐써플로우로 가중치를 랜덤으로 생성하는 방법)

2x3 행렬로 -1 에서 1 사이의 난수를 생성하는 변수 W 생성하고

안의 내용을 확인하시오

 

import tensorflow as tf

W = tf.Variable(tf.random_uniform([2,3],-1,1) )

init = tf.global_variables_initializer()

sess = tf.Session()

sess.run(init)

print(sess.run(W))

[[-0.0447793   0.35337305  0.95867515]

 [ 0.5095768   0.71167827  0.21496177]]

 

 

 

 

문제23. 이번에는 mnist 데이터에 맞게 100x784 내적 시킬

가중치 행렬 784x50 으로 W 생성하시오

import tensorflow as tf

W = tf.Variable(tf.random_uniform([784,50],-1,1))

init = tf.global_variables_initializer()

sess = tf.Session()

sess.run(init)

print(sess.run(W))

 

 

 

 

문제24.위에서 만든 입력값(문제21) 100x784 지금 만든

가중치 784x50 행렬과 내적을 결과를 출력하시오

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

import matplotlib.pyplot as plt

import numpy as np

 

mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

 

batch_xs, batch_ys = mnist.train.next_batch(100)

 

x = tf.placeholder("float", [None, batch_xs.shape[1] ])

W = tf.Variable(tf.random_uniform([784,50],-1,1))

y = tf.matmul(x,W)

 

init = tf.global_variables_initializer()

 

sess = tf.Session()

sess.run(init)

 

print(sess.run(y, feed_dict = {x:batch_xs}))

# feed_dict    placeholder  짝꿍이네 !

# feed_dict 해줘야 하는 이유는, y에서 내적시키는 x 빈깡통이라 그렇다.

# 그럼 바로 batch_xs 내적시키지 않느냐?

# 나중의 for 문을 위해서?

 

 

 

 

문제25. 1x50 으로 bias 생성하는데  변수 b 해서 생성하고

숫자를 1 채우시오

 

b = tf.Variable(tf.ones([50]))

[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.

 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.

 1. 1.]

 

 

 

 

문제26. 문제 24번에서 구한 행렬의 내적과 지금 방금 생성한

바이어스의 합을 출력하시오

 

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

import matplotlib.pyplot as plt

import numpy as np

 

mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

 

batch_xs, batch_ys = mnist.train.next_batch(100)

 

x = tf.placeholder("float", [None, batch_xs.shape[1] ])

W = tf.Variable(tf.random_uniform([784,50],-1,1))

b = tf.Variable(tf.ones([50]))

y = tf.matmul(x,W) + b

 

init = tf.global_variables_initializer()

 

sess = tf.Session()

sess.run(init)

 

sess.run(y, feed_dict = { x : batch_xs } )

 

print(sess.run(y, feed_dict = { x : batch_xs } ) )

 

 

 

문제27. 문제26번에서 구한 가중의 합인 y값을 시그모이드 함수에 입력해서

출력한 결과를 출력하시오

 

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

import matplotlib.pyplot as plt

import numpy as np

 

mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

 

batch_xs, batch_ys = mnist.train.next_batch(100)

 

x = tf.placeholder("float", [None, batch_xs.shape[1] ])

W = tf.Variable(tf.random_uniform([784,50],-1,1))

b = tf.Variable(tf.ones([50]))

y = tf.matmul(x,W)

y_hat = tf.nn.sigmoid(y)

 

init = tf.global_variables_initializer()

 

sess = tf.Session()

sess.run(init)

 

print(sess.run(y_hat, feed_dict = { x : batch_xs } ) )

 

 

 

 

문제28. 위의 활성화 함수를 Relu 변경하시오

y_hat = tf.nn.relu(y)

 

 

 

문제29. relu 자리에 softmax 함수로 바꿔서 결과를 확인하시오

(50개짜리 확률벡터가 100 출력이 됨이 예상)

 

y_hat = tf.nn.softmax(y)

 

print(sess.run(y_hat, feed_dict = { x : batch_xs } ).shape )

(100, 50)

 

(*10개짜리 확률벡터 100개로 출력하고 싶으면

가중치 , 바이어스를 10으로 조절하면 )

 

 

 

 

문제30. 텐써플로우의 argmax 함수를 이용해서 위에서 출력된

100 x 10 확률벡터들의 최대값의 인덱스 번호를 100 출력하시오

 

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

import matplotlib.pyplot as plt

import numpy as np

 

mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

 

batch_xs, batch_ys = mnist.train.next_batch(100)

 

x = tf.placeholder("float", [None, batch_xs.shape[1] ])

W = tf.Variable(tf.random_uniform([784,10],-1,1))

b = tf.Variable(tf.ones([10]))

y = tf.matmul(x,W)

y_hat = tf.nn.softmax(y)

y_predict = tf.argmax(y_hat, axis=1)

#텐써플로우도 axis 먹네 !

 

init = tf.global_variables_initializer()

 

sess = tf.Session()

sess.run(init)

 

res = sess.run(y_predict, feed_dict = { x : batch_xs } )

print(res)

 

[2 3 3 2 3 3 2 2 2 8 1 2 5 2 9 1 2 5 1 2 2 2 1 2 2 2 4 2 1 3 2 1 1 2 2 2 3

 3 5 3 2 3 1 2 1 2 7 3 1 1 9 2 2 2 2 2 3 5 2 1 2 2 2 1 3 2 3 2 2 2 2 3 2 2

 3 1 3 3 2 5 3 3 3 2 3 2 3 2 5 1 2 2 3 2 6 1 2 9 2 2]

 

 

 

문제31. 위의 코드에 라벨을 가져오는 코드를 추가해서 정확도를 출력하시오

(위의 예상 숫자 100개와 실제 숫자 100개를 비교)

 

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

import matplotlib.pyplot as plt

import numpy as np

 

mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

 

batch_xs, batch_ys = mnist.train.next_batch(100)

 

 

x = tf.placeholder("float", [None, batch_xs.shape[1] ])

W = tf.Variable(tf.random_uniform([784,10],-1,1))

b = tf.Variable(tf.ones([10]))

y = tf.matmul(x,W)

y_hat = tf.nn.softmax(y)

y_predict = tf.argmax(y_hat, axis=1)

 

y_onehot = tf.placeholder("float", [None, batch_ys.shape[1] ])   #batch_ys.shape=(100,10)

y_label = tf.argmax(y_onehot, axis = 1)  # 행의 최대값(=1) 위치를  y_label .

 

correction_prediction = tf.equal(y_predict, y_label)

 

# 코렉트 값이 궁금하면

# print(sess.run(correction_prediction, feed_dict={x:batch_xs, y_onehot:batch_ys}))

 

#correction_prediction 값은 y_predict y_label 일치하는지 여부를 알아보는건데

# True, False 출력된다.

 

accuracy = tf.reduce_mean(tf.cast(correction_prediction, "float"))

 

 

init = tf.global_variables_initializer()

 

sess = tf.Session()

sess.run(init)

 

res = sess.run(accuracy, feed_dict = { x : batch_xs, y_onehot : batch_ys } )

print(res)

 

sess.close()

0.16

 

 

 

 

 

텐써플로우로 구현하는 비용함수

1. 최소 제곱 오차 함수(mean square error)

loss = tf.square(y_predict, y_label)

 

2. 교차 엔트로피 오차 함수(cross entropy error)

loss = -tf.reduce_sum(y_onehot * tf.log(y_hat), axis = 1)

 

 

 

 

 

문제32. 문제 30 코드에 교차엔트로피 오차함수를 추가하고

loss 출력하시오

 

loss = -tf.reduce_sum(y_onehot * tf.log(y_hat), axis = 1)

res = sess.run(loss, feed_dict = { x : batch_xs, y_onehot : batch_ys } )

print(res)

shape 출력하면 (100, )

[1.42483377e+01 7.22421348e-01 1.56299715e+01 3.40242505e+00

 1.28419905e+01 1.48971329e+01 1.21687508e+01 1.33595791e+01

 7.10315956e-03 1.19459877e+01 8.51134968e+00 1.68233395e+01

 9.20306015e+00 1.09574823e+01 6.06568193e+00 2.03526993e+01

 3.45761108e+00 1.08285246e+01 1.03507166e+01 1.76002932e+00

 1.22226591e+01 2.38204460e+01 9.29154587e+00 7.87348700e+00

 9.29230785e+00 7.54559994e-01 1.90012240e+00 9.27303553e-01

 8.47396946e+00 5.02397239e-01 6.08358479e+00 7.63305044e+00

 6.81868935e+00 4.98679161e+00 1.35864191e+01 7.65258455e+00

 1.00881567e+01 1.60566254e+01 6.39382505e+00 1.00467997e+01

 6.41455269e+00 8.81856728e+00 1.12891331e+01 1.56854963e+01

 1.11069984e+01 1.41771698e+01 1.31383572e+01 6.32930851e+00

 7.84320974e+00 2.98508525e+00 1.28846369e+01 1.18018794e+00

 1.30097857e+01 6.15150213e+00 7.51492643e+00 4.29232979e+00

 8.66516352e-01 1.58611336e+01 1.74337387e+01 6.48370075e+00

 3.79400826e+00 5.05280674e-01 1.18435993e+01 4.17667896e-01

 1.58419924e+01 1.27990475e+01 1.37267427e+01 3.93933392e+00

 9.71058941e+00 1.59759569e+01 5.53912926e+00 1.13975811e+01

 1.75223446e+01 8.69794846e-01 3.46382236e+00 3.75985670e+00

 1.29541683e+01 9.51675415e+00 1.00980520e+01 9.33732510e+00

 7.71608734e+00 5.72446108e+00 4.65133858e+00 3.75041604e+00

 1.37293806e+01 6.81753933e-01 3.06026578e+00 1.05885067e+01

 1.43503342e+01 9.25425243e+00 1.95589657e+01 1.97497654e+00

 1.24376621e+01 2.41304207e+00 1.47398758e+01 1.25563517e+01

 7.76232529e+00 3.03995752e+00 9.10892010e+00 4.64027703e-01]

 

*트라이가 배치로 100개니까 오차가 100 나온다.

* 오차중 낮은 오차를 가지고 역전파 시켜서 최종 10개를 출력하는 거다.

 

 

 

 

 

경사감소법을 텐써플로우로 구현하는 방법

 

# optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)

SGD :

 미니배치만큼 랜덤으로 데이터를 추출해서 확률적으로 경사를 감소하여

 global minima 찾아가는 방법

 

단점 :  Local minima 에 잘 빠진다.

 

 

# optimizer = tf.train.AdagradOptimizer(learning_rate=0.01)

러닝 레이트가 학습되면서 자동 조절되는 경사감소법

(맞춤형 경사감소법)

 

 

# optimizer = tf.train.MomentumOptimizer(learning_rate=0.01)

관성을 이용해서 local minima 에 안빠지게 하는 경사감소법

(속도붙이기)

 

 

# optimizer = tf.train.AdamOptimizer(learning_rate=0.01)

Adagrade 장점 + Momentum 의 장점

 

 

 

 

 

문제33. 지금까지 만든 코드에 Adam 경사감소법 코드를 추가해서

학습이 되게 하시오

 

optimizer = tf.train.AdamOptimizer(learning_rate = 0.01)

train = optimizer.minimize(loss) #loss 최소화하겠다

 

res_train = sess.run(train, feed_dict = { x : batch_xs, y_onehot : batch_ys } )

# Adam 통해서 최소화 loss 구한다

 

res_accu = sess.run(accuracy, feed_dict = { x : batch_xs, y_onehot : batch_ys } )

 

print(res_accu)

 

 

 

 

문제34. 위의 코드에 for loop 이용해서 1에폭 돌게 구성하시오

 

 

 

문제35.(오늘의 마지막 문제)

위의 코드를 수정해서 아래와 같이 결과가 출력되게 하시오

결과:

1에폭 정확도: 0.93

2에폭 정확도: 0.88

3에폭 정확도: 0.89

 

 

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

import matplotlib.pyplot as plt

import numpy as np

 

mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

 

batch_xs, batch_ys = mnist.train.next_batch(100)

 

 

 

x = tf.placeholder("float", [None, batch_xs.shape[1] ])

W = tf.Variable(tf.random_uniform([784,10],-1,1))

b = tf.Variable(tf.ones([10]))

y = tf.matmul(x,W)

y_hat = tf.nn.softmax(y)

y_predict = tf.argmax(y_hat, axis=1)

 

y_onehot = tf.placeholder("float", [None, batch_ys.shape[1] ])

y_label = tf.argmax(y_onehot, axis = 1)

correction_prediction = tf.equal(y_predict, y_label)

accuracy = tf.reduce_mean(tf.cast(correction_prediction, "float"))

 

loss = -tf.reduce_sum(y_onehot * tf.log(y_hat), axis = 1)

 

optimizer = tf.train.AdamOptimizer(learning_rate = 0.01)

train = optimizer.minimize(loss) #loss 최소화하겠다

 

 

init = tf.global_variables_initializer()

 

sess = tf.Session()

sess.run(init)

 

#res_train = sess.run(train, feed_dict = { x : batch_xs, y_onehot : batch_ys } )

#res_accu = sess.run(accuracy, feed_dict = { x : batch_xs, y_onehot : batch_ys } )

# 여기서 얘네 선언해주는건 무의미함.

# 이해를 위해 정도로 .

 

#print(res_accu)

 

 

for i in range(1,4):

    for j in range(1,601):

        batch_xs, batch_ys = mnist.train.next_batch(100)

        sess.run(train, feed_dict = {x:batch_xs, y_onehot:batch_ys})

    print("%d에폭 정확도:" %(i),\

              sess.run(accuracy, feed_dict = {x:batch_xs, y_onehot:batch_ys}))

 

# for 안에 mnist.train.next_batch(100) 새로 넣어주면

# 위에서 선언한 배치를 가지고 반복 돌려서 같은값이 출력된다.

# train 통해서 loss 최소화 시켜주고

# loss 가지고 accuracy 출력한다.

 

sess.close()

 

 

=============================================

선생님 코드

import tensorflow as tf

tf.reset_default_graph()

 

from tensorflow.examples.tutorials.mnist import input_data

 

mnist = input_data.read_data_sets('MNIST_data/', one_hot = True)

 

# 계층 생성

x = tf.placeholder("float",[None,784])

W = tf.get_variable(name='W', shape=[784, 10], initializer=tf.contrib.layers.variance_scaling_initializer())

b = tf.Variable(tf.ones([10]))

y = tf.matmul(x,W) + b

y_hat = tf.nn.softmax(y)

y_predict = tf.argmax(y_hat, axis = 1)

 

# 라벨을 저장하기 위한 변수 생성

y_onehot = tf.placeholder("float",[None,10])

y_label = tf.argmax(y_onehot, axis = 1)

 

# 정확도를 출력하기 위한 변수 생성

correct_prediction = tf.equal(y_predict, y_label)

acc = tf.reduce_mean(tf.cast(correct_prediction,"float"))

 

# 교차 엔트로피 오차 함수

loss = -tf.reduce_sum(y_onehot * tf.log(y_hat), axis = 1)

 

# SGD 경사 감소법

# optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.05)

 

# Adam 경사 감소법

optimizer = tf.train.AdamOptimizer(learning_rate=0.005)

 

# 학습 오퍼레이션 정의

Train = optimizer.minimize(loss)

 

# 변수 초기화

init = tf.global_variables_initializer()

 

with tf.Session() as sess:

 

    sess.run(init)

 

    for i in range(10000):

 

        batch_xs, batch_ys = mnist.train.next_batch(100)

 

        sess.run(Train, feed_dict={x : batch_xs, y_onehot : batch_ys})

 

        if i % 600 == 0:

           

            print(i / 600 + 1,'ecpo acc:', sess.run(acc, feed_dict={x:batch_xs, y_onehot: batch_ys}))

           

728x90
반응형

'tensorflow' 카테고리의 다른 글

5. 실습-폐사진  (0) 2019.03.31
4. 실습-개고양이  (0) 2019.03.31
3. 텐써플로우 다층신경망 구성  (0) 2019.03.31
1. 텐써플로우 소개  (0) 2019.03.31