해당 자료는 "모두를 위한 머신러닝/딥러닝 강의"를 보고 개인적으로 정리한 내용입니다.
본 실습의 tensorflow는 1.x 버전입니다.
Softmax Classification을 Tensorflow로 구현
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
#tensorflow v1호환
# X data는 행은 여러개, 열은 4개의 변수로 이루어져 있으므로 Shape는 [None,4]
# Y data는 one hot encoding 된 형태로 0 = [1,0,0] , 1 = [0,1,0], 2=[0,0,1]
x_data = [[1, 2, 1, 1], [2, 1, 3, 2], [3, 1, 3, 4], [4, 1, 5, 5], [1, 7, 5, 5],
[1, 2, 5, 6], [1, 6, 6, 6], [1, 7, 7, 7]]
y_data = [[0, 0, 1], [0, 0, 1], [0, 0, 1], [0, 1, 0], [0, 1, 0], [0, 1, 0], [1, 0, 0], [1, 0, 0]]
X = tf.placeholder("float", [None, 4])
Y = tf.placeholder("float", [None, 3])
nb_classes = 3
# 매트릭스 곱 형태인 XW = Y 이므로 [None,4] * [?,?] = [None,3]
# X의 열 수가 W의 행, Y의 열 수가 W의 열 이므로 W의 Shape는 [4,3]
W = tf.Variable(tf.random_normal([4, nb_classes]), name='weight')
b = tf.Variable(tf.random_normal([nb_classes]), name='bias')
# softmax를 통해 Y햇 값을 0~1사이의 확률로 변환
# softmax를 통해 구한 값의 총합은 1
# tf.matmul은 매트릭스 곱
# tf.nn.softmax computes softmax activations
# softmax = exp(logits) / reduce_sum(exp(logits), dim)
hypothesis = tf.nn.softmax(tf.matmul(X, W) + b)
# cost 함수를 정의하고 GradientDescent알고리즘으로 최적화
# cost함수는 (Y * log(Y햇) = Y * log(hypothesis)) 값의 평균
# Cross entropy cost/loss
cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(hypothesis), axis=1))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)
# Launch graph
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
# 모델 학습
for step in range(2001):
sess.run(optimizer, feed_dict={X: x_data, Y: y_data})
if step % 200 == 0:
print(step, sess.run(cost, feed_dict={X: x_data, Y: y_data}))
# 학습된 모델에 X값을 던져서 예측 결과 출력
a = sess.run(hypothesis, feed_dict={X: [[1, 11, 7, 9]]})
# tf.arg_max함수는 X값으로 얻은 3개의 Y값 중 가장 큰 값의 위치를 알려줌
# tf.arg_max 함수에 의해 두번째 항목이 제일 크기 때문에 1을 리턴
print(a, sess.run(tf.arg_max(a, 1)))
arg_max
- 파라미터는 변수와 차원매개변수를 제공
- 차원 매개변수
- 변수가 1차원이면 0, 2차원이면 0 또는 1, 3차원이면 0 또는 1 또는 2
- 0인 경우 열
- 1인 경우 행
- 2인 경우 행열
- 예 1. 2차원배열
- 변수 A가 [[0.1,0.4,0.5]] 인 2차원 배열인 경우
- argmax(A,0)
- 매개변수 0은 열로 구분함을 의미
- 변수 3개가 각각 구분되어 1개씩 제공되어 연산
- 0.1 = 0 , 0.4 = 0, 0.5 = 0
- 1개씩 있으므로 해당 값이 가장 크고 0번째 순서로 리턴
- 최종 리턴값 => [0,0,0]
- argmax(A,1)
- 매개변수 1은 행으로 구분함을 의미
- 변수 3개가 한번에 전달
- [0.1, 0.4, 0.5] = 2
- 최종 리턴값 => 2
- 예 2. 3차원 배열
- [[[0.1, 0.3, 0.7], [0.3, 0.7, 0.1]] , [[0.7, 0.1, 0.3], [0.1, 0.3, 0.7]] , [[0.3, 0.7, 0.1], [0.7, 0.1, 0.3]]]
- 순서대로 [[[A, B, C], [D, E, F]] ,[[G, H, I],[J, K, L]],[[M, N, O],[P, Q, R]] 이라고 표현
- 매개변수 0인 경우
- 열로 구분
- 0.1 0.7 0.3 = A G M = 1
- 0.3 0.1 0.7 = B H N = 2
- 0.7 0.3 0.1 = C I O = 0 => [1, 2, 0]
- 0.3 0.1 0.7 = D J P = 2
- 0.7 0.3 0.1 = E K Q = 0
- 0.1 0.7 0.3 = F L R = 1 => [2, 0, 1]
- 최종 리턴값 => [[1, 2, 0],[2, 0, 1]]
- 매개변수 1인 경우
- 행으로 구분
- 0.1 0.3 = A D = 1
- 0.3 0.7 = B E = 1
- 0.7 0.1 = C F = 0 => [1, 1, 0]
- 0.7 0.1 = G J = 0
- 0.1 0.3 = H K = 1
- 0.3 0.7 = I L = 1 => [0, 1, 1]
- 0.3 0.7 = M P = 1
- 0.7 0.1 = N Q = 0
- 0.1 0.3 = O R = 1 => [1, 0, 1]
- 최종 리턴값 => [[1, 1, 0],[0, 1, 1],[1, 0, 1]]
- 매개변수 2인 경우
- 행열로 구분
- [0.1, 0.3, 0.7] = A B C = 2
- [0.3, 0.7, 0.1] = D E F = 1 => [2, 1]
- [0.7, 0.1, 0.3] = G H I = 0
- [0.1, 0.3, 0.7] = J K L = 2 => [0, 2]
- [0.3, 0.7, 0.1] = M N O = 1
- [0.7, 0.1, 0.3] = P Q R = 0 => [1, 0]
- 최종 리턴값 => [2, 1], [0, 2], [1, 0]]
- [[[0.1, 0.3, 0.7], [0.3, 0.7, 0.1]] , [[0.7, 0.1, 0.3], [0.1, 0.3, 0.7]] , [[0.3, 0.7, 0.1], [0.7, 0.1, 0.3]]]
'도서,강의 요약 > 모두를 위한 머신러닝' 카테고리의 다른 글
lec 07-1: 학습 rate, Overfitting, 그리고 일반화 (Regularization) (0) | 2020.06.15 |
---|---|
ML lab 06-2: TensorFlow로 Fancy Softmax Classification의 구현하기 (0) | 2020.06.11 |
ML lec 6-2: Softmax classifier 의 cost함수 (0) | 2020.05.30 |
ML lec 6-1 - Softmax Regression: 기본 개념 소개 (0) | 2020.05.28 |
ML lab 05: TensorFlow로 Logistic Classification의 구현하기 (0) | 2020.05.28 |