wiki.hash.kr/index.php/%EC%A0%9C%ED%94%84%EB%A6%AC_%ED%9E%8C%ED%8A%BC
ํํผ์ ํ๋์ ๋ชฉํ๋ณ์์ ๋ํด ์ฌ๋ฌ ๊ฐ์ ํผ์ ํธ๋ก ์ ๋์์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ธฐ์กด์ ์ ๊ฒฝ๋ง์ ๋์ฒดํ ์ ์ผํ ๋ฐฉ๋ฒ์์ ํ์ ํ๊ณ ์ฐ๊ตฌํ๋ค. ๊ฒฐ๊ตญ ๋ค์์ ํผ์ ํธ๋ก ์ ํจ๊ป ์ฌ์ฉํ๋ค๋ฉด ๋น์ ํ ๋ฌธ์ ๋ํ ํด๊ฒฐํ ์ ์๋ค๋ ๊ฒ์ ๋ณด์๋ค. ๋ณ๋ ฌ๋ก ๋ฐฐ์น๋ ๋ ํผ์ ํธ๋ก ์ ๊ฐ์ ์๋ฃ๋ฅผ ์ ๋ ฅํ ๋, ๋ ํผ์ ํธ๋ก ์ ์ถ๋ ฅ์ ๋ฌด์์ผ๋ก ํ๋ ๊ทธ์ค์ฐจ๋ฅผ ๋ค์ ์๋์ ๊ฐ์ค์น๋ค๋ก ๋ฐ์ด ๋ฃ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ธํ ๊ฐ์ด ๋ค์ด๊ฐ๋ ๋ค์ ํผ์ ํธ๋ก ์ด ๋์ผํ๋ค. ์ด๋ด ๊ฒฝ์ฐ ์ ๊ฒฝ๋ง์ ๋ณ๋ก ๋ฐฐ์ฐ๋ ๊ฒ์ด ์๋ค.
๊ทธ๋ฌ๋ ๋ ํฌ์ ํธ๋ก ์ ์ง๋ ฌ๋ก ์ฐ๊ฒฐํด์ ํ ํผ์ ํธ๋ก ์ ์ถ๋ ฅ์ด ๋ค๋ฅธ ํผ์ ํธ๋ก ์ ์ ๋ ฅํ๊ฒ ํ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค. ์ญ์ ํ๋ ๋จ์ผ ํผ์ ํธ๋ก ์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๋๋ฐ ๋์์ ์ค๋ค. ์ญ์ ํ๋ฅผ ์ ํ์ฉํ๋ ค๋ฉด ํผ์ ํธ๋ก ์ ๊ตฌ์กฐ๋ฅผ ์กฐ์จํด์ผ ํ๋ค. ์ด ๋ ์ด ํผ์ ํธ๋ก ์ ์ค์ฐจ๊ฐ ์ด์ ๊ณผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ ์ํ๊ธฐ ์ด๋ ต๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ํ์ธต์ ํ ๊ฐ์ค์น๊ฐ ์ค์ฐจ์ ๊ธฐ์ฌํ๋ ์ ๋๋ฅผ ๊ทธ๋ค์ ์ธต์ ์๋ ๋ค๋ฅธ ๊ฐ์ค์น๋ค์ ๊ทผ๊ฑฐํด์ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค. ์ญ์ ํ๊ฐ ๋ฐ๋ก ๊ทธ๋ ๋ค.
์ ๊ฒฝ๋ง์ ๊ตฌ์ฑํ๋ ๋จ์๋ฅผ ๋ด๋ฐ(node, unit, cell)์ด๋ผ ํ๋ค. ์ธ๊ณต ์ ๊ฒฝ๋ง์ ์ข ๋ฅ๋ ๋ค์ํ์ง๋ง, ์ด๋ค ๊ฒ์ด๋ ๋ค์์ ๋ด๋ฐ์ด ํน์ ํ ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๋ ์ ์ ๋ชจ๋ ๊ฐ๋ค. ํ ๋ด๋ฐ์ด ๋ค๋ฅธ ๋ด๋ฐ์ ์ ๋ ฅ๋๋ ๊ตฌ์กฐ์์๋ ์ ๋ ฅ์ธต๊ณผ ์ถ๋ ฅ์ธต ์ฌ์ด์ ์จ๊ฒจ์ง ๋ด๋ฐ๋ค์ด ์กด์ฌํ๋ค. ์ด๋ฐ ๋ด๋ฐ๋ค๋ก ์ด๋ฃจ์ด์ง ์ธต์ ์๋์ธต(hidden layer)๋ผ ํ๋ค.
ํ ์ธต์ ๋ด๋ฐ๋ค์ด ๊ทธ ๋ค์ ์ธต์ ๋ชจ๋ ๋ด๋ฐ๊ณผ ์ฐ๊ฒฐ๋ ์ ๊ฒฝ๋ง์ ์์ ์ฐ๊ฒฐ(fully conected) ์ ๊ฒฝ๋ง์ด๋ผ ํ๋ค. ์ ๊ฒฝ๋ง์ ๋์งธ ์ธต์ ๋ด๋ฐ๋ค์ ๋ถ์ฌ๋ ๊ฐ์ค์น๋ ์๋์ ์ ๋ ฅ ๋ฒกํฐ๊ฐ ์๋๋ผ ๊ทธ ์ด์ ์ธต์ ์ถ๋ ฅ์ ์ ์ฉ๋๋ ๊ฒ์ด๋ค.
์ค์ฐจ์ ์ญ์ ํ๋ฅผ ์ค์ธ ์ญ์ ํ ์๊ณ ๋ฆฌ์ฆ์ ์ ๊ฒฝ๋ง์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ, ๊ทธ๋ฆฌ๊ณ ๋ชฉํ๊ฐ์ด ์ฃผ์ด์ก์ ๋ ํน์ ๊ฐ์ค์น์ ์ ์ ํ ๋ณํ๋์ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์์ ํ ๋จ๊ณ์์๋ ์ ๋ ฅ์ด ์ ๊ฒฝ๋ง์ ๋ฐ๋ผ -> ์๋ฐฉํฅ์ผ๋ก ๋์๊ฐ ์ ๊ฒฝ๋ง์ ์ถ๋ ฅ์ด ๊ณ์ฐ๋๋ค. ์ญ์ ํ๋ ๋ฐ๋์ ๋ฐฉํฅ์ผ๋ก ํ์ฑํ ํจ์๋ฅผ ์ฝ๊ฐ ๋ ๋ณต์กํ ํํ๋ก ๋ณ๊ฒฝํด์ผํ๋ค.
์ด์ ์๋ treshold๋ฅผ ๊ณ๋จ ํ์์ผ๋ก ์ก์๋ค๋ฉด ํ์ฑํ ํจ์๋ฅผ ๋น์ ํ ์ฐ์ ๋ฏธ๋ถ๊ฐ๋ฅํ ํจ์๋ฅผ ์ฌ์ฉํด์ผํ๋ค. ์ด๋ฐ ํ์ฑํ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ด๋ฐ์ 0~1 ์ฌ์ด์ ์ฐ์๊ฐ์ ์ถ๋ ฅํ๋ค. ์๊ทธ๋ชจ์ด๋ ํจ์๊ฐ ๋ํ์ ์ด๋ค. ๊ทธ ์ธ์ Relu, tanh ๋ฑ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค.
S(x) = $\frac{1}{1+\exp^{-x}}$
ํ์ฑํ ํจ์๊ฐ ๋ฏธ๋ถ ๊ฐ๋ฅํด์ผํ๋ ์ด์ ๋ ํ ๊ฐ์ค์น์ ํด๋น ๋ด๋ฐ์ด ๋ฐ์ ์ ๋ ฅ์ ๋ํ ๋ณํ๋์ ๊ณ์ฐํ ์ ์๋ ๊ฒ์ ๋ฏธ๋ถ๊ฐ๋ฅํ ํจ์๋ฅผ ํธ๋ฏธ๋ถ์ผ๋ก ๊ตฌํ๋ค.
์์ ๊ตฌํํ XOR ๋ฌธ์ ๋ฅผ Keras ๋ชจ๋ธ๋ก ๊ตฌํ
์ฒซ์ธต์ ๋ด๋ฐ์ด 10๊ฐ์ด๊ณ ๋ด๋ฐ๋น ๊ฐ์ค์น๋ ์ธ๊ฐ(input_dim+1)์ด๋ค.(10x3) ๊ทธ ๋ค์ ์ธต์ธ ์ถ๋ ฅ์ธต์ ๋ด๋ฐ์ด ํ๋๋ฟ์ด๊ณ ์ด ๋ด๋ฐ์ ์ฒซ ์ธต์ ๋ด๋ฐ 10๊ฐ๊ฐ ์ฐ๊ฒฐ๋๋ค. ๊ฑฐ๊ธฐ์ Dense ์ธต +1์ด ์์ผ๋ฏ๋ก ๊ฐ์ค์น๋ ์ด 11๊ฐ๊ฐ ๋๋ค.
# XOR ์ผ๋ผ์ค ์ ๊ฒฝ๋ง
import numpy as np
from tensorflow.keras.models import Sequential # ๊ธฐ๋ณธ ์ผ๋ผ์ค ๋ชจํ ํด๋์ค
from tensorflow.keras.layers import Dense,Activation # Dense - ์์ ์ฐ๊ฒฐ ์ ๊ฒฝ๋ง
from tensorflow.keras.optimizers import SGD # SGD ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
x_train = np.array([[0,0],
[0,1],
[1,0],
[1,1]])
y_train = np.array([[0],
[1],
[1],
[1]])
model = Sequential()
num_neurons = 10
model.add(Dense(num_neurons,input_dim=2))
model.add(Activation('tanh'))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.summary()
# Model: "sequential_1"
# _________________________________________________________________
# Layer (type) Output Shape Param #
# =================================================================
# dense_2 (Dense) (None, 10) 30
# _________________________________________________________________
# activation_3 (Activation) (None, 10) 0
# _________________________________________________________________
# dense_3 (Dense) (None, 1) 11
# _________________________________________________________________
# activation_4 (Activation) (None, 1) 0
# =================================================================
# Total params: 41
# Trainable params: 41
# Non-trainable params: 0
# _________________________________________________________________
SGD ๊ฒฝ์ฌ ํ๊ฐ๋ฒ
lr์ ๊ฐ ๊ฐ์ค์น์ ๋ํ ์ค์ฐจ์ ๋ฏธ๋ถ์ ๊ฐ์ค์น ๊ฐฑ์ ์ ์ ์ฉํ๋ ๋น์จ๋ก, ํ์ต ์๋(learning rate) $\alpha$์ ํด๋นํ๋ค.
$\alpha$ ๊ฐ์ด ์ปค์ง๋ฉด ํ์ต์ด ๋นจ๋ผ์ง์ง๋ง, ๋์ ๋ชจํ์ด ๋ชฉํ์ ์ ์ง๋์ณ์ ์ ์ญ ์ต์์ ์์ ๋ฉ์ด ์ง์ ์๋ค. ๋ฐ๋๋ก ํ์ต ์๋๊ฐ ์์ผ๋ฉด ํ๋ จ ์๊ฐ์ด ๊ธธ์ด์ง๊ณ ๋ชจํ์ด ๊ทน์์ ์ ๋จธ๋ฌด๋ฅด๋ ์ํ๋ ์ปค์ง๋ค.
loss์ ๋ณ์๋ ์์คํจ์์ธ๋ฐ ์ด์ง ๊ต์ฐจ ์ํธ๋กํผ ํจ์ binary_crossentropy๋ฅผ ์ฌ์ฉํ๋ค. metrics๋ ๋์ค์ ์ถ๋ ฅํ ์ต์
์ด๋ค. ์ด ๋ฉ์๋๋ ๊ฐ์ค์น๋ฅผ ๋ฌด์์๋ก ์ด๊ธฐํํ๋ฉฐ ์ด ์ํ์ ๋ชจํ์ผ๋ก ์์ธก์ ์ํํ๋ฉด ๋ฌด์์ ๊ฐ์ ์ป๊ฒ ๋๋ค.
sgd = SGD(lr=0.1)
model.compile(loss='binary_crossentropy',optimizer=sgd,metrics=['accuracy'])
predict
predict๋ ๋ง์ง๋ง ์ธต์ ์ถ๋ ฅ์ ๊ทธ๋๋ก ๋๋ ค์ค๋ค. ํ๋ จ ํ์ง ์์ ์ํ์ด๋ฏ๋ก ๋ฌด์์ ๊ฐ์ด๋ค.
model.predict(x_train)
# array([[0.5 ],
# [0.6596914 ],
# [0.56276333],
# [0.7013184 ]], dtype=float32)
fit ๋ชจ๋ธ ํ๋ จ
model.fit(x_train,y_train,epochs=100)
# Epoch 82/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1919 - accuracy: 1.0000
# Epoch 83/100
# 1/1 [==============================] - 0s 4ms/step - loss: 0.1896 - accuracy: 1.0000
# Epoch 84/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1875 - accuracy: 1.0000
# Epoch 85/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1853 - accuracy: 1.0000
# Epoch 86/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1832 - accuracy: 1.0000
# Epoch 87/100
# 1/1 [==============================] - 0s 4ms/step - loss: 0.1810 - accuracy: 1.0000
# Epoch 88/100
# 1/1 [==============================] - 0s 4ms/step - loss: 0.1790 - accuracy: 1.0000
# Epoch 89/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1769 - accuracy: 1.0000
# Epoch 90/100
# 1/1 [==============================] - 0s 4ms/step - loss: 0.1748 - accuracy: 1.0000
# Epoch 91/100
# 1/1 [==============================] - 0s 4ms/step - loss: 0.1728 - accuracy: 1.0000
# Epoch 92/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1708 - accuracy: 1.0000
# Epoch 93/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1689 - accuracy: 1.0000
# Epoch 94/100
# 1/1 [==============================] - 0s 4ms/step - loss: 0.1669 - accuracy: 1.0000
# Epoch 95/100
# 1/1 [==============================] - 0s 4ms/step - loss: 0.1650 - accuracy: 1.0000
# Epoch 96/100
# 1/1 [==============================] - 0s 4ms/step - loss: 0.1631 - accuracy: 1.0000
# Epoch 97/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1613 - accuracy: 1.0000
# Epoch 98/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1594 - accuracy: 1.0000
# Epoch 99/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1576 - accuracy: 1.0000
# Epoch 100/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1558 - accuracy: 1.0000
# Out[32]: <tensorflow.python.keras.callbacks.History at 0x1e51f00e908>
model predict
์์ธก์ด ์ ํํ ๊ฒ์ ๋ณผ ์ ์๋ค.
model.predict(x_train)
# Out[33]:
# array([[0.29926434],
# [0.90582585],
# [0.8655339 ],
# [0.9829213 ]], dtype=float32)
model.predict_classes(x_train)
# Out[34]:
# array([[0],
# [1],
# [1],
# [1]])
model save
๋ชจ๋ธ์ keras์์ ๋ค์ ๋ถ๋ฌ์ฌ ์ ์๊ฒ json ํ์ผ๋ก ์ ์ฅ. (์ ๊ฒฝ๋ง ๊ตฌ์กฐ๋ง ์ ์ฅ)
์ ์ฅ ํ json ํ์ผ์ h5 ์ ๊ฒฝ๋ง ๊ตฌ์กฐ๋ก ์ ๊ฒฝ๋ง ์ธ์คํด์ค๋ฅผ ์ ์ฅ
import h5py
model_structure = model.to_json() # ์ผ๋ผ์ค์์ ๋ค์ ๋ถ๋ฌ์ฌ ์ ์๊ฒ json์ผ๋ก ์ ์ฅ
with open("basic_model.json",'w') as json_file:
json_file.write(model_structure)
model.save_weights("basic_weights.h5")
'๐พ Deep Learning' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Batch Normalization (0) | 2021.03.02 |
---|---|
GAN (Generative Adversarial Networks) (0) | 2021.02.26 |
ํ์ด์ฌ์ ๋ด๋ฐ (0) | 2021.02.24 |
[Transformer] Model ์ ๋ฆฌ (0) | 2021.02.23 |
VAE(Variational autoencoder) ์ข ๋ฅ (0) | 2021.02.21 |