※ Tensorflow1문법을 2로만 바꾸는것이기에, 코드분석 위주로 진행하고있습니다.
[Tensorflow1 링크종합] https://limitsinx.tistory.com/50
※ 이 전글에서 정리한 코드/문법은 재설명하지 않으므로, 참고부탁드립니다.
코드만 해석하고 넘어가기에 다소 불친절한 글 일수 있습니다..
개념적인 부분은 하기 링크에 따로 정리해두어, 참조 부탁드립니다.
https://limitsinx.tistory.com/36
Softmax는 여러개의 classification을 나눌때 사용하는 activation function입니다.
sigmoid는 0이냐 1이냐를 구분하는 binary classification을 했었죠
Softmax는 0~9까지 숫자를 주고 이중에 내가 input으로 넣을 이미지는 뭔지 맞춰봐! 이런경우에 사용됩니다.
Softmax에 대한 자세한 개념적인 내용은 상기 링크 참조 부탁드립니다.
[코드 전문]
import tensorflow as tf
import numpy as np
x_raw = [[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_raw = [[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_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=4, units=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([[1, 11, 7, 9]]))
print(a, tf.keras.backend.eval(tf.argmax(a, axis=1)))
print('--------------')
b = tf.model.predict(np.array([[1, 3, 4, 3]]))
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([[1, 1, 0, 1]]))
c_onehot = tf.model.predict_classes(np.array([[1, 1, 0, 1]]))
print(c, c_onehot)
print('--------------')
all = tf.model.predict(np.array([[1, 11, 7, 9], [1, 3, 4, 3], [1, 1, 0, 1]]))
all_onehot = tf.model.predict_classes(np.array([[1, 11, 7, 9], [1, 3, 4, 3], [1, 1, 0, 1]]))
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을 할 수 있습니다!
'DeepLearning Framework & Coding > Tensorflow 2.X' 카테고리의 다른 글
[코드로 이해하는 딥러닝 2-7] - Deep and Wide Neural Network(DWNN) (0) | 2021.01.11 |
---|---|
[코드로 이해하는 딥러닝 2-6] - Deep Neural Network/XOR (0) | 2021.01.10 |
[코드로 이해하는 딥러닝 2-4] - Logistic Regression(sigmoid) (3) | 2021.01.08 |
[코드로 이해하는 딥러닝2-3] - .txt(.csv)파일 불러오기 (0) | 2021.01.07 |
[코드로 이해하는 딥러닝2-2] - 다중선형회귀(Multiple Linear Regression) (0) | 2021.01.06 |
댓글