본문 바로가기

도서,강의 요약/모두를 위한 머신러닝

ML lab 06-1: TensorFlow로 Softmax Classification의 구현하기

 

해당 자료는 "모두를 위한 머신러닝/딥러닝 강의"를 보고 개인적으로 정리한 내용입니다.

http://hunkim.github.io/ml/

 

모두를 위한 머신러닝/딥러닝 강의

 

hunkim.github.io

 

본 실습의 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이 리턴

 

ML_lab_06_1.ipynb
0.00MB

 

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]]