본문 바로가기
DeepLearning Framework & Coding/Tensorflow 2.X

[코드로 이해하는 딥러닝 2-5] - Softmax Regression(multiple classification)

by 노마드공학자 2021. 1. 9.

※ Tensorflow1문법을 2로만 바꾸는것이기에, 코드분석 위주로 진행하고있습니다.

[Tensorflow1 링크종합] https://limitsinx.tistory.com/50

 

 

※ 이 전글에서 정리한 코드/문법은 재설명하지 않으므로, 참고부탁드립니다.

코드만 해석하고 넘어가기에 다소 불친절한 글 일수 있습니다..

   개념적인 부분은 하기 링크에 따로 정리해두어, 참조 부탁드립니다.

https://limitsinx.tistory.com/36

 

[코드로 이해하는 딥러닝 9] - Softmax Regression(multiple classification)

[코드로 이해하는 딥러닝 0] - 글연재에 앞서 https://limitsinx.tistory.com/27 [코드로 이해하는 딥러닝 1] - Tensorflow 시작 https://limitsinx.tistory.com/28 [코드로 이해하는 딥러닝 2] - Tensorflow 변..

limitsinx.tistory.com

 

Softmax는 여러개의 classification을 나눌때 사용하는 activation function입니다.

sigmoid는 0이냐 1이냐를 구분하는 binary classification을 했었죠

 

Softmax는 0~9까지 숫자를 주고 이중에 내가 input으로 넣을 이미지는 뭔지 맞춰봐! 이런경우에 사용됩니다.

 

Softmax에 대한 자세한 개념적인 내용은 상기 링크 참조 부탁드립니다.

 

 

[코드 전문]

 

import tensorflow as tf

import numpy as np

 

x_raw = [[1211],

          [2132],

          [3134],

          [4155],

          [1755],

          [1256],

          [1666],

          [1777]]

y_raw = [[001],

          [001],

          [001],

          [010],

          [010],

          [010],

          [100],

          [100]]

 

x_data = np.array(x_raw, dtype=np.float32)

y_data = np.array(y_raw, dtype=np.float32)

 

nb_classes = 3

 

tf.model = tf.keras.Sequential()

tf.model.add(tf.keras.layers.Dense(input_dim=4units=nb_classes, use_bias=True))  # use_bias is True, by default

 

# use softmax activations: softmax = exp(logits) / reduce_sum(exp(logits), dim)

tf.model.add(tf.keras.layers.Activation('softmax'))

 

# use loss == categorical_crossentropy

tf.model.compile(loss='categorical_crossentropy'optimizer=tf.keras.optimizers.SGD(lr=0.1), metrics=['accuracy'])

tf.model.summary()

 

history = tf.model.fit(x_data, y_data, epochs=2000)

 

print('--------------')

# Testing & One-hot encoding

a = tf.model.predict(np.array([[11179]]))

print(a, tf.keras.backend.eval(tf.argmax(a, axis=1)))

 

print('--------------')

b = tf.model.predict(np.array([[1343]]))

print(b, tf.keras.backend.eval(tf.argmax(b, axis=1)))

 

print('--------------')

# or use argmax embedded method, predict_classes

c = tf.model.predict(np.array([[1101]]))

c_onehot = tf.model.predict_classes(np.array([[1101]]))

print(c, c_onehot)

 

print('--------------')

all = tf.model.predict(np.array([[11179], [1343], [1101]]))

all_onehot = tf.model.predict_classes(np.array([[11179], [1343], [1101]]))

print(all, all_onehot)

 

 

[코드 분석]

이부분만 코드를 이해하시면, 나머지 부분은 기존까지 정리해온 코드와 동일합니다.

 

nb_classes란, 몇개의 classification을할꺼니?에 대한 답입니다.

즉, y_data는 [1,0,0] [0,1,0], [0,0,1] 이렇게 3개의 class만 가지고 있으므로, 3을 넣어주시면 됩니다.

 

① tf.model.add(tf.keras.layers.Dense(input_dim=4,units=nb_classes,use_bias=True))

: x_data는 특징이 4개(4차원)이며, output은 당연히 nb_classes와 갯수가 동일하겠죠! 3이라 적어줘도 똑같습니다.

또한 y=wx+b에서 b를 사용할지 안할지를 True or False로 지정해준 코드입니다.

 

② tf.model.add(tf.keras.layers.Activation('softmax'))

: Activation function을 softmax로 지정한 코드

 

③ tf.model.compile(loss='categorical_crossentropy',optimizer=tf.keras.optimizers.SGD(lr=0.1),metrics=['accuracy'])

: cost(loss) function을 categorical crossentropy라는것을 이용하는데요

이것은 그냥 외워주시면됩니다! 복잡하게 수학적으로 유도하는 방법이 있긴한데요

굳이 리만적분을 매일 하면서 적분을 하는게 아니듯, 중요한건 "언제" 쓰느냐는 것이기에.. 그냥 외워주세요!

나머지는 SGD optimizer를 이용하는 코드입니다.

 

 

[결과값(2000번 학습)]

2천번 정도 학습시키니 3개 각각 테스트해봤던것을 1,0,2 class로 정확하게 예측하는 모습이네요

 

이런식으로 multi classification을 할 수 있습니다!

댓글