Tensor Flow 기반의 Code 분석 코드는 git hub에 잘 정리된 Code를 퍼왔습니다.
출처 : https://github.com/golbin/TensorFlow-Tutorials
주석도 잘 달려 있었으나 제가 초보적인 관점에서 공부를 하는 마음으로 조금 더 추가 했습니다.
정리하다 보니 one-hot encode와 reduce_mean의 개념을 추가로 추가로 정리해야 겠네요. ^^
모두 열심히 공부합시다다
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 | # 털과 날개가 있는지 없는지에 따라, 포유류인지 조류인지 분류하는 신경망 모델을 만들어봅니다. import tensorflow as tf import numpy as np # [털, 날개] 라고 가정한다 # 2가지 데이터 . 즉, input Node는 2개 # x_data 는 2가지 데이터를 가진 데이터 Set이 6개 x_data = np.array( [[0, 0], [1, 0], [1, 1], [0, 0], [0, 0], [0, 1]]) # [기타, 포유류, 조류] 라고 가정한다. # 3가지 분류 Output Node는 3개 # 다음과 같은 형식을 one-hot 형식의 데이터라고 합니다. ( 하나만 1, 나머지 0 ) # 정답(Label)을 의미하는 y_data이 one-hot 형식을 하는 이유는 ? # 예측 시 확률 적으로 가장 큰 값을 그것!? 으로 분류하는데 # 만약 예측 값이 [ 0.8 , 0.1 , 0.1 ] 일 경우 # 정답[1, 0, 0] 과의 차이를 줄여 나가는 방식으로 # W와 b를 정교화하는데 # 이 때, ont-hot 형식이어야 차이 값 비교하는 연산을 하기 쉽기 때문이다. # 만약 데이터가 y_data = np.array([[0],[1],[2],[0],[0],[2]))라면 # 데이터를 비교하기 어렵다. # 이럴 경우는 .one_hot이라는 함수를 통해 one-hot형식으로 변경 할 수 있다. y_data = np.array([ [1, 0, 0], # 기타 [0, 1, 0], # 포유류 [0, 0, 1], # 조류 [1, 0, 0], [1, 0, 0], [0, 0, 1] ]) ######### # 신경망 모델 구성 ###### X = tf.placeholder(tf.float32) Y = tf.placeholder(tf.float32) # 신경망은 2차원으로 [입력층(특성), 출력층(레이블)] -> [2, 3] 으로 정합니다. W = tf.Variable(tf.random_uniform([2, 3], -1., 1.)) # 편향을 각각 각 레이어의 아웃풋 갯수로 설정합니다. # 편향은 아웃풋의 갯수, 즉 최종 결과값의 분류 갯수인 3으로 설정합니다. b = tf.Variable(tf.zeros([3])) # 신경망에 가중치 W과 바이어스 b을 적용합니다 # Y' = XW + b L = tf.add(tf.matmul(X, W), b) # 가중치와 편향을 이용해 계산한 결과 값에 # 텐서플로우에서 기본적으로 제공하는 활성화 함수인 ReLU 함수를 적용합니다. # Activation 함수 종류는 많은 종류가 있으나, ReLU는 미분하면 0과 1의 값이 나오기 때문에 # Deep Learning에서 계산을 줄여 성능을 높일 수 있기 때문에 많이 사용한다. L = tf.nn.relu(L) # 마지막으로 softmax 함수를 이용하여 출력값을 사용하기 쉽게 만듭니다 # softmax 함수는 다음처럼 결과값을 전체합이 1인 확률로 만들어주는 함수입니다. # 예) [8.04, 2.76, -6.52] -> [0.53 0.24 0.23] # softmax 함수는 확률을 1로 만들어 Label 값 , # 즉 , one-hot encoding된 정답 값과 차이를 비교하기 쉽게 하기 위해서 사용한다. # 참고로 ,one-hot 된 값도 모두 더하면 1, softmax 된 값도 모두 더하면 1이기 때문에 비교가 쉽다. model = tf.nn.softmax(L) # 신경망을 최적화하기 위한 비용 함수를 작성합니다. # 각 개별 결과에 대한 합을 구한 뒤 평균을 내는 방식을 사용합니다. # 전체 합이 아닌, 개별 결과를 구한 뒤 평균을 내는 방식을 사용하기 위해 axis 옵션을 사용합니다. # axis 옵션이 없으면 -1.09 처럼 총합인 스칼라값으로 출력됩니다. # Y model Y * tf.log(model) reduce_sum(axis=1) # 예) [[1 0 0] [[0.1 0.7 0.2] -> [[-1.0 0 0] -> [-1.0, -0.09] # [0 1 0]] [0.2 0.8 0.0]] [ 0 -0.09 0]] # 즉, 이것은 예측값과 실제값 사이의 확률 분포의 차이를 비용으로 계산한 것이며, # 이것을 Cross-Entropy 라고 합니다. cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(model), axis=1)) optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01) train_op = optimizer.minimize(cost) ######### # 신경망 모델 학습 ###### init = tf.global_variables_initializer() sess = tf.Session() sess.run(init) for step in range(100): sess.run(train_op, feed_dict={X: x_data, Y: y_data}) if (step + 1) % 10 == 0: print(step + 1, sess.run(cost, feed_dict={X: x_data, Y: y_data})) ######### # 결과 확인 # 0: 기타 1: 포유류, 2: 조류 ###### # tf.argmax: 예측값과 실제값의 행렬에서 tf.argmax 를 이용해 가장 큰 값을 가져옵니다. # 예) [ [ 0 1 0] [ 1 0 0 ] ] -> [1 0] : # index가 0 1 0 일 때 가장 큰 값의 index는 1 , 1 0 0 index 0 이므로 [ 1 0 ] # [[0.2 0.7 0.1] [0.9 0.1 0.0]] -> [1 0] prediction = tf.argmax(model, 1) target = tf.argmax(Y, 1) print('예측값:', sess.run(prediction, feed_dict={X: x_data})) print('실제값:', sess.run(target, feed_dict={Y: y_data})) is_correct = tf.equal(prediction, target) accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32)) print('정확도: %.2f' % sess.run(accuracy * 100, feed_dict={X: x_data, Y: y_data})) | cs |
'Deep Learning > Tensor Flow' 카테고리의 다른 글
Tensor Flow Code 분석 - 기본 변수 선언과 함수 수행 (0) | 2017.08.28 |
---|