Tensor Flow의 기본 변수및 함수 설명입니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 텐서플로우의 기본적인 구성을 익힙니다.
import tensorflow as tf
 
# tf.constant: 말 그대로 상수입니다.
hello = tf.constant('Hello, TensorFlow!')
print(hello)
 
= tf.constant(10)
= tf.constant(32)
= tf.add(a, b)  # a + b 로도 쓸 수 있음
print(c)
 
# 위에서 변수와 수식들을 정의했지만, 실행이 정의한 시점에서 실행되는 것은 아닙니다.
# 다음처럼 Session 객제와 run 메소드를 사용할 때 계산이 됩니다.
# 따라서 모델을 구성하는 것과, 실행하는 것을 분리하여 프로그램을 깔끔하게 작성할 수 있습니다.
# 그래프를 실행할 세션을 구성합니다.
sess = tf.Session()
# sess.run: 설정한 텐서 그래프(변수나 수식 등등)를 실행합니다.
print(sess.run(hello))
print(sess.run([a, b, c]))
 
# 세션을 닫습니다.
sess.close()
 
cs


'Deep Learning > Tensor Flow' 카테고리의 다른 글

Tensor Flow Code 분석 - Neural Network  (0) 2017.08.28
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(
    [[00], [10], [11], [00], [00], [01]])
 
# [기타, 포유류, 조류] 라고 가정한다. 
# 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([
    [100],  # 기타
    [010],  # 포유류
    [001],  # 조류
    [100],
    [100],
    [001]
])
 
#########
# 신경망 모델 구성
######
= tf.placeholder(tf.float32)
= tf.placeholder(tf.float32)
 
# 신경망은 2차원으로 [입력층(특성), 출력층(레이블)] -> [2, 3] 으로 정합니다.
= tf.Variable(tf.random_uniform([23], -1.1.))
 
# 편향을 각각 각 레이어의 아웃풋 갯수로 설정합니다.
# 편향은 아웃풋의 갯수, 즉 최종 결과값의 분류 갯수인 3으로 설정합니다.
= tf.Variable(tf.zeros([3]))
 
# 신경망에 가중치 W과 바이어스 b을 적용합니다
# Y' = XW + b
= tf.add(tf.matmul(X, W), b)
# 가중치와 편향을 이용해 계산한 결과 값에
# 텐서플로우에서 기본적으로 제공하는 활성화 함수인 ReLU 함수를 적용합니다.
# Activation 함수 종류는 많은 종류가 있으나, ReLU는 미분하면 0과 1의 값이 나오기 때문에 
# Deep Learning에서 계산을 줄여 성능을 높일 수 있기 때문에 많이 사용한다.
= 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




+ Recent posts