๋ณธ ๋ด์ฉ์ ํธ์ฆ์จ ๋จธ์ ๋ฌ๋2 ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ์์ผ๋ฉฐ, ์๋ต๋ ๋ด์ฉ์ด๋ ์ถ๊ฐ๋ ๋ด์ฉ์ด ์์ต๋๋ค.
[10.1] ์๋ฌผํ์ ๋ด๋ฐ์์ ์ธ๊ณต ๋ด๋ฐ๊น์ง
[10.1.2] ๋ด๋ฐ์ ์ฌ์ฉํ ๋ ผ๋ฆฌ ์ฐ์ฐ
- ๋งค์ฐ ๋จ์ํ ์ ๊ฒฝ๋ง ๋ชจ๋ธ์ ์ ์ํ์๋๋ฐ, ๊ทธ๊ฒ์ด ์ธ๊ณต ๋ด๋ฐ
- ๋ ผ๋ฆฌ ๋ช ์ ๊ณ์ฐ ๊ฐ๋ฅ
- ์ฒซ ๋ฒ์งธ ๋คํธ์ํฌ
- ํญ๋ฑ ํจ์
- ๋ด๋ฐ A ํ์ฑํ, ๋ด๋ฐ C ํ์ฑํ
- ๋ด๋ฐ A ๋นํ์ฑํ, ๋ด๋ฐ C ๋นํ์ฑํ
- ๋ ๋ฒ์ฌ ๋คํธ์ํฌ
- ๋ ผ๋ฆฌ๊ณฑ ์ฐ์ฐ
- A, B ๋ชจ๋ ํ์ฑํ๋ ๋ ํ์ฑํ
- ์ธ ๋ฒ์งธ ๋คํธ์ํฌ
- A, B ์ค ํ๋๊ฐ ํ์ฑํ๋๋ฉด C๋ ํ์ฑํ
- ๋ค ๋ฒ์งธ ๋คํธ์ํฌ
- ๋ด๋ฐ A๊ฐ ํ์ฑํ๋๊ณ ๋ด๋ฐ B๊ฐ ๋นํ์ฑํ๋ ๋ ๋ด๋ฐ C๊ฐ ํ์ฑํ๋ฉ๋๋ค. ๋ง์ฝ ๋ด๋ฐ A๊ฐ ํญ์ ํ์ฑํ๋์ด ์๋ค๋ฉด ์ด ๋คํธ์ํฌ๋ ๋ ผ๋ฆฌ ๋ถ์ ์ฐ์ฐ์ด ๋ฉ๋๋ค. ์ฆ, ๋ด๋ฐ B๊ฐ ๋นํ์ฑํ๋ ๋ ๋ด๋ฐ C๊ฐ ํ์ฑํ๋๊ณ , ๋๋ ์ ๋ฐ๋๋ก ๋ด๋ฐ B๊ฐ ํ์ฑํ๋ ๋ ๋ด๋ฐ C๊ฐ ๋นํ์ฑํ๋ฉ๋๋ค.
[10.1.3] ํผ์ ํธ๋ก
- TLU์ LTU๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
- TLU๋ ์ ๋ ฅ์ ๊ฐ์ค์น ํฉ์ ๊ณ์ฐํ ๋ค ๊ณ์ฐ ํฉ์ ๊ณ๋จํจ์๋ฅผ ์ ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ
- ํผ์ ํธ๋ก ์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๊ณ๋จ ํจ์๋ ํค๋น์ฌ์ด๋ ๊ณ๋จ ํจ์์ด๋ค.
- TLU๋ ๊ฐ๋จํ ์ ํ ์ด์ง ๋ถ๋ฅ ๋ฌธ์ ์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
- ํผ์ ํธ๋ก ์ ์ธต์ด ํ๋๋ฟ์ธ TLU๋ก ๊ตฌ์ฑ๋๋ค. ๊ฐ TLU๋ ๋ชจ๋ ์ ๋ ฅ์ ์ฐ๊ฒฐ๋์ด ์๋ค.
- ํ ์ธต์ ์๋ ๋ชจ๋ ๋ด๋ฐ์ด ์ด์ง ์ธต์ ๋ชจ๋ ๋ด๋ฐ๊ณผ ์ฐ๊ฒฐ๋์ด ์์ ๋ ์ด๋ฅผ ์์ ์ฐ๊ฒฐ ์ธต, ๋ฐ์ง ์ธต ์ด๋ผ๊ณ ํ๋ค.
- ํผ์ ํธ๋ก ์ ๋คํธ์ํฌ๊ฐ ์์ธกํ ๋ ๋ง๋๋ ์ค์ฐจ๋ฅผ ๋ฐ์ํ๋๋ก ์กฐ๊ธ ๋ณํ๋ ๊ท์น์ ์ฌ์ฉํ์ฌ ํ๋ จํ๋ค.
- ํผ์ ํธ๋ก ์ ํ ๋ฒ์ ํ๋์ ์ํ์ด ์ฃผ์ ๋๋ฉด ๊ฐ ์ํ์ ๋ํด ์์ธก์ด ๋ง๋ค์ด์ง๋ค.
- wi, j๋ i๋ฒ์งธ ์ ๋ ฅ ๋ด๋ฐ๊ณผ j๋ฒ์งธ ์ถ๋ ฅ ๋ด๋ฐ ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฐ์ค์น์ ๋๋ค.
- xi๋ ํ์ฌ ํ๋ จ ์ํ์ i๋ฒ์งธ ๋ด๋ฐ์ ์ ๋ ฅ๊ฐ์ ๋๋ค.
- yi๋ ํ์ฌ ํ๋ จ ์ํ์ j๋ฒ์งธ ์ถ๋ ฅ ๋ด๋ฐ์ ์ถ๋ ฅ๊ฐ์ ๋๋ค.
- yj๋ ํ์ฌ ํ๋ จ ์ํ์ j๋ฒ์งธ ์ถ๋ ฅ ๋ด๋ฐ์ ํ๊น๊ฐ์ ๋๋ค.
- η๋ ํ์ต๋ฅ ์ ๋๋ค
import numpy as np
from sklearn.datasets import load_iris
from sklearn.linear_model import Perceptron
iris = load_iris()
X = iris.data[:, (2,3)] #๊ฝ์์ ๊ธธ์ด์ ๋๋น
y = (iris.target == 0).astype(np.int) #๋ถ์ฑ๋ถ๊ฝ์ธ๊ฐ?
per_clf = Perceptron()
per_clf.fit(X, y)
y_pred = per_clf.predict([2, 0.5])
- ํผ์
ํธ๋ก ์ XOR ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋๋ฐ, ์ด๋ฅผ ํด๊ฒฐํ ๊ฒ์ด ๋ค์ธต ํผ์
ํธ๋ก (MLP)์ด๋ค.
[10.1.4] ๋ค์ธต ํผ์ ํธ๋ก ๊ณผ ์ญ์ ํ
- ๋ค์ธต ํผ์ ํธ๋ก ์ ์ ๋ ฅ์ธต ํ๋์ ์๋์ถฉ์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ํ๋ ์ด์์ TLU์ธต๊ณผ ๋ง์ง๋ง ์ถ๋ ฅ์ธต์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
- ์
๋ ฅ์ธต๊ณผ ๊ฐ๊น์ด ์ธต์ ๋ณดํต ํ์ ์ธต์ด๋ผ ๋ถ๋ฅด๊ณ , ์ถ๋ ฅ์ ๊ฐ๊น์ด ์ธต์ ์์ ์ธต์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์๋์ธต์ ์ฌ๋ฌ ๊ฐ ์์ ์ฌ๋ฆฐ ์ธ๊ณต ์ ๊ฒฝ๋ง์ ์ฌ์ธต ์ ๊ฒฝ๋ง(DNN)์ด๋ผ๊ณ ํ๋ค.
- ์ญ์ ํ : ํจ์จ์ ์ธ ๊ธฐ๋ฒ์ผ๋ก ๊ทธ๋ ์ด์ธํธ๋ฅผ ์๋์ผ๋ก ๊ณ์ฐํ๋ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ด๋ค.
- ์ ๋ ฅ์ธต -> ์ฒซ ๋ฒ์งธ ์๋์ธต -> ์ธต์ ์๋ ๋ชจ๋ ๋ด๋ฐ์ ์ถ๋ ฅ์ ๊ณ์ฐ -> ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ธต์ผ๋ก ์ ๋ฌ -> ๊ณ์ฐํ ๋ค์ ์ธต์ผ๋ก ์ ๋ฌ -> ์ถ๋ ฅ์ธต๊น์ง ์ ๋ฌ ํ ๊ณ์ฐ / ์ด๊ฒ์ด ์ ๋ฐฉํฅ ๊ณ์ฐ
- ์ฐ์ ๋ฒ์น : ์ด์ ์ธต์ ์ฐ๊ฒฐ ๊ฐ์ค์น๊ฐ ์ด ์ค์ฐจ์ ๊ธฐ์ฌ ์ ๋ ์ผ๋ง๋ ๊ธฐ์ฌํ๋์ง ์ธก์ . ์ด๋ ๊ฒ ์ ๋ ฅ์ธต์ ๋๋ฌํ ๋๊น์ง ์ญ๋ฐฉํฅ์ผ๋ก ๊ณ์๋๋ค.
- ์ค์ฐจ ๊ทธ๋ ๋์ธํธ๋ฅผ ๊ฑฐ๊พธ๋ก ์ ํํจ์ผ๋ก์จ ํจ์จ์ ์ผ๋ก ๋คํธ์ํฌ์ ์๋ ๋ชจ๋ ์ฐ๊ฒฐ ๊ฐ์ค์น์ ๋ํ ์ค์ฐจ ๊ทธ๋ ๋์ธํธ๋ฅผ ์ธก์ -> ๋ฐฉ๊ธ ๊ณ์ฐํ ์ค์ฐจ ๊ทธ๋ ๋์ธํธ๋ฅผ ์ฌ์ฉํด ๋คํธ์ํฌ์ ์๋ ๋ชจ๋ ์ฐ๊ฒฐ ๊ฐ์ค์น๋ฅผ ์์ ํ๋ค.
- ์ ๋ฐฉํฅ ๊ณ์ฐ ์ค์ฐจ ์ธก์ -> ์ญ๋ฐฉํฅ ๊ณ์ฐ์ผ๋ก ์ค์ฐจ์ ๊ธฐ์ฌํ ์ ๋๋ฅผ ์ธก์ -> ์ค์ฐจ๊ฐ ๊ฐ์ํ๋๋ก ๊ฐ์ค์น๋ฅผ ์กฐ์ (๊ฒฝ์ฌ ํ๊ฐ๋ฒ)
- ์ญ์ ํ ์๊ณ ๋ฆฌ์ฆ์ ์ฐ๋ ํ์ฑํ ํจ์๋ ๋ก์ง์คํฑ(์๊ทธ๋ชจ์ด๋) ํจ์ ๋ฟ๋ง์๋๋ผ ํ์ดํผ๋ณผ๋ฆญ ํ์ ํธ ํจ์, ReLU ํจ์๊ฐ ์กด์ฌํ๋ค.
- ํ์ฑํ ํจ์๊ฐ ํ์ํ ์ด์ : ์ ํ ๋ณํ์ ์ฌ๋ฌ ๊ฐ ์ฐ๊ฒฐํด๋ ์ป์ ์ ์๋๊ฑด ์ ํ ๋ณํ ๋ฟ์ด๋ค. ๋ฐ๋ผ์ ์ธต ์ฌ์ด์ ๋น์ ํ์ฑ์ ์ถ๊ฐํ์ง ์์ผ๋ฉด ์๋ฌด๋ฆฌ ์ธต์ ์์๋ ํ๋์ ์ธต๊ณผ ๋์ผํด์ง๊ธฐ ๋๋ฌธ
[10.1.5] ํ๊ท๋ฅผ ์ํ ๋ค์ธต ํผ์ ํธ๋ก
- ๋์์ ์ฌ๋ฌ ๊ฐ์ ์์ธกํ๋ ๊ฒฝ์ฐ ์ถ๋ ฅ ์ฐจ์๋ง๋ค ์ถ๋ ฅ ๋ด๋ฐ์ด ํ๋์ฉ ํ์ํ๋ค
- ์ถ๋ ฅ์ด ํญ์ ์์์ฌ์ผ ํ๋ค๋ฉด ์ถ๋ ฅ์ธต์ ReLU ํ์ฑํ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋๋ softplus ํ์ฑํ ํจ์๋ฅผ ์ด์ฉ๊ฐ๋ฅํ๋ค.
- ํ๋ จ์ ์ฌ์ฉํ๋ ์์ค ํจ์๋ ์ ํ์ ์ผ๋ก ํ๊ท ์ ๊ณฑ ์ค์ฐจ์ด๋ค. ํ์ง๋ง ํ๋ จ ์ธํธ์ ์ด์์น๊ฐ ๋ง๋ค๋ฉด ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด Hubor ์์ค์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. (์ด์์น์ ๋ ๋ฏผ๊ฐํจ)
[10.1.6] ๋ถ๋ฅ๋ฅผ ์ํ ๋ค์ธต ํผ์ ํธ๋ก
- ๋ค์ธต ํผ์ ํธ๋ก ์ ๋ค์ค ๋ ์ด๋ธ ์ด์ง ๋ถ๋ฅ ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
- ์๋ฅผ ๋ค์ด ์ด๋ฉ์ผ์ด ์คํธ ์ธ์ง ์๋์ง ์์ธกํ๊ณ ๋์์ ๊ธด๊ธํ ์ด๋ฉ์ผ์ธ์ง ์๋์ง ์์ธกํ๋ ์ด๋ฉ์ผ ๋ถ๋ฅ ์์คํ ์ ์ ์ฉ ๊ฐ๋ฅํ๋ค
- ์ฒซ ๋ฒ์งธ ๋ด๋ฐ์ ์ด๋ฉ์ผ์ด ์คํธ์ผ ํ๋ฅ ์ ์ถ๋ ฅํ๊ณ , ๋ ๋ฒ์งธ ๋ด๋ฐ์ ๊ธด๊ธํ ๋ฉ์ผ์ผ ํ๋ฅ ์ ์ถ๋ ฅํ๋ค.
- ์ฌ๋ฌ ํด๋์ค ์ค ํ ํด๋์ค์๋ง ์ํ ์ ์๋ค๋ฉด ํด๋์ค์ ์๋งํผ ํ๋์ ์ถ๋ ฅ ๋ด๋ฐ์ด ํ์ํ๋ค.
- ์ํํธ๋งฅ์ค ํจ์๋ ๋ชจ๋ ์์ธก ํ๋ฅ ์ 0๊ณผ 1์ฌ์ด๋ก ๋ง๋ค๊ณ ๋ํ์ ๋ 1์ด ๋๋๋ก ๋ง๋ ๋ค.
- ํ๋ฅ ๋ถํฌ๋ฅผ ์์ธกํด์ผ ํ๋ฏ๋ก ์์ค ํจ์์๋ ์ผ๋ฐ์ ์ผ๋ก ํฌ๋ก์ค ์ํธํฌ๋ฆฌ ์์ค์ ์ ํํ๋ ๊ฒ์ด ์ข๋ค.
- ๋ค์ค ๋ ์ด๋ธ ๋ถ๋ฅ๋ ์ฌ๋ฌ ๊ฐ๊ฐ ์ ๋ต์ด ๋ ์ ์๋ค. ๋ฐ๋ผ์ ๋ก์ง์คํฑ ํจ์๋ฅผ ์ฌ์ฉ
[10.2] ์ผ๋ผ์ค๋ก ๋ค์ธต ํผ์ ํธ๋ก ๊ตฌํํ๊ธฐ
[10.2.2] Sequential API๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ๋ถ๋ฅ๊ธฐ ๋ง๋ค๊ธฐ
from tensorflow import keras
fashion_mnist = keras.datasets.fashion_mnist
(X_train_full, y_train_full) , (X_test, y_test) = fashion_mnist.load_data()
# validation๊ณผ train set ๋ถ๋ฅ
# X๊ฐ์ 255๋ก ๋๋์ด 0๊ณผ 1์ฌ์ด๋ก ์ค์ผ์ผ๋ง
X_valid, X_train = X_train_full[:5000] / 255.0
, X_train_full[5000:] / 255.0
y_valid, y_train = y_train_full[:5000], y_train_full[5000:]
X_test = X_test / 255.0
# ํด๋์ค ์ด๋ฆ์ ์ ์
class_name = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat", "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]
# Sequential API๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ ๋ง๋ค๊ธฐ
# ๋ ๊ฐ์ ์๋์ธต์ผ๋ก ์ด๋ฃจ์ด์ง ๋ถ๋ฅ์ฉ ๋ค์ธต ํผ์
ํธ๋ก
model = keras.models.Sequential([
keras.layers.Flatten(input_shape=[28, 28]),
keras.layers.Dense(300, activation="relu"),
keras.layers.Dense(100, activation="relu")
keras.layers.Dense(10, activation="softmax")
])
# ์ฒซ ๋ฒ์งธ ๋ผ์ธ์ Sequentail ๋ชจ๋ธ์ ๋ง๋ ๋ค.
# Flatten ์ธต์ ์
๋ ฅ ์ด๋ฏธ์ง๋ฅผ 1D ๋ฐฐ์ด๋ก ๋ณํํ๋ค.
# ๊ทธ ๋ค์ ๋ด๋ฐ 300๊ฐ๋ฅผ ๊ฐ์ง Dense ์๋์ธต์ ์ถ๊ฐํ๋ค. ReLu ํ์ฑํ ํจ์ ์ฌ์ฉ
# ๊ทธ ๋ค์ ๋ด๋ฐ 100๊ฐ๋ฅผ ๊ฐ์ง Dense ์๋์ธต์ ์ถ๊ฐํ๋ค. ReLu ํ์ฑํ ํจ์ ์ฌ์ฉ
# ๋ง์ง๋ง์ผ๋ก ๋ด๋ฐ 10๊ฐ๋ฅผ ๊ฐ์ง Dense ์ถ๋ ฅ์ธต์ ์ถ๊ฐํ๋ค. ๋ฐฐํ์ ์ธ ํด๋์ค์ด๊ณ ๋ฉํฐํด๋์ค์ด๋ฏ๋ก ์ํํธ๋งฅ์ค ํ์ฑํ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
# ์ธ๋ฑ์ค๋ฅผ ํตํด ํน์ ๋ ์ด์ด๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๋ค.
hidden1 = model.layers[1]
hidden1.name
>>> 'dense'
model.get_layer('dense') is hidden 1
>>> True
# ์ธต์ ๋ชจ๋ ํ๋ผ๋ฏธํฐ๋ get_weights()์ set_weights() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
weights, biases = hidden1.get_weights()
# ๋ชจ๋ธ ์ปดํ์ผ
# ๋ฉํฐํด๋์ค ๋ถ๋ฅ๋ฅผ ํ ๋ ํ๊ฒ์ด ํด๋์ค ์ธ๋ฑ์ค์ธ ๊ฒฝ์ฐ sparse_categorical_crossentropy ์ฌ์ฉ
# ๋ฉํฐํด๋์ค ๋ถ๋ฅ๋ฅผ ํ ๋ ํ๊ฒ์ด ๊ฐ ํด๋์ค์ผ ํ๋ฅ ์ ๋ํ๋ธ ๋ฒกํฐ์ธ ๊ฒฝ์ฐ categorical_crossentropy ์ฌ์ฉ
# ์ด์ง ๋ถ๋ฅ๋ ๋ค์ค ๋ ์ด๋ธ ์ด์ง ๋ถ๋ฅ๋ฅผ ์ํํ๋ค๋ฉด ์ถ๋ ฅ์ธต์ "softmax" ๋์ "sigmoid" ํจ์๋ฅผ ์ฌ์ฉํ๊ณ "binary_crossentropy" ์ฌ์ฉ
# ์๊ทธ๋ชจ์ด๋๋ ๊ฐ์ฒด์ ๋ํด ๊ฐ๋ณ์ ์ธ ๋ถ๋ฅ๋ฅผ ์ํ, ์ด์ง๋ถ๋ฅ์ ๊ฒฝ์ฐ ์ฌ์ฉ
# ์ํํธ๋งฅ์ค๋ ๋ชจ๋ ํด๋์ค์ ๋ํด ํ๋ฅ ๊ฐ์ ํฉ์ด 1๋ก ๊ณ ์ , ๋ค๋ถ๋ฅ ์ถ๋ ฅ์ด ๊ฐ๋ฅ
model.compile(loss = "sparse_categorical_crossentropy",
optimizer = "sgd",
metrics=["accuracy"]
)
# ๋ชจ๋ธ ํ๋ จ๊ณผ ํ๊ฐ
history = model.fit(X_train, y_train, epochs=30, validation_data = (X_valid, y_valid))
# history object
import pandas as pd
import matplotlib.pyplot as plt
pd.DataFrame(history.history).plot(figsize=(8,5))
plt.grid(True)
plt.gca().set_ylim(0, 1) # ์์ง ์ถ์ ๋ฒ์๋ฅผ [0-1]๋ก ์ค์
plt.show()
# validation ๊ณก์ ๊ณผ train ๊ณก์ ์ด ๊ฐ๊น๋ค. ํฌ๊ฒ ๊ณผ๋์ ํฉ ๋์ง ์์๋ค๋ ์ฆ๊ฑฐ.
# ํ๋ จ๋ ๋ชจ๋ธ์ ํ๊ฐ
model.evaluate(X_test, y_test)
# ๋ชจ๋ธ์ ์ฌ์ฉํด ์์ธก ๋ง๋ค๊ธฐ
# predict()๋ฅผ ์ฌ์ฉํด ์๋ก์ด ์ํ์ ๋ํด ์์ธก์ ๋ง๋ค ์ ์๋ค.
X_new = X_test[:3]
y_proba = model.predict(X_new)
y_proba.round(2)
# predict_classes๋ก ๋ฌด์จ ํด๋์ค๋ก ์์ธก๋๋์ง ๊ตฌํ ์ ์๋ค.
y_pred = model.predict_classes(X_new)
y_pred = np.argmax(y_proba, axis=1)
y_pred
>>> array([9, 2, 1])
- ์๊ทธ๋ชจ์ด๋ ํจ์๋ ๋ก์ง์คํฑ ํจ์์ ํ ์ผ์ด์ค์ด๋ค
- input์ด ํ๋์ผ ๋ ์ฌ์ฉ๋๋ ์๊ทธ๋ชจ์ด๋ ํจ์๋ฅผ input์ด ์ฌ๋ฌ ๊ฐ์ผ๋๋ ์ฌ์ฉํ ์ ์๋๋ก ์ผ๋ฐํ ํ ๊ฒ์ด ์ํํธ๋งฅ์ค ํจ์์ด๋ค.
- ์ํํธ๋งฅ์ค : 3๊ฐ ์ด์์ผ๋ก ๋ถ๋ฅํ๋ ๋ค์ค ํด๋์ค ๋ถ๋ฅ์์ ์ฌ์ฉ๋๋ ํ์ฑํ ํจ์ / ํ๋ฅ ๋ถํฌ๋ฅผ ์ ์ ์๋ค, ๊ฐ ํด๋์ค์ ์ํ ํ๋ฅ ์ ์ถ์ , ์ถ๋ ฅ ๊ฐ์ ์ดํฉ์ด 1์ด ๋๋ค.
[10.2.3] Sequential API๋ฅผ ์ฌ์ฉํ์ฌ ํ๊ท์ฉ ๋ค์ธต ํผ์ ํธ๋ก ๋ง๋ค๊ธฐ
- ์ฌ์ดํท๋ฐ์ fetch_california_housing ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StadardScaler
housing = fetch_california_housing()
X_train_full, X_test, y_train_full, y_test = train_test_split(housing.data, housing.target)
X_train, X_valid, y_train, y_valid = train_test_split(X_train_full, y_train_full)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_valid = scaler.transform(X_valid)
X_test = scaler.transform(X_test)
# ๋ถ๋ฅ์์ ์ฐจ์ด์ : ์ถ๋ ฅ์ธต์ด ํ์ฑํ ํจ์๊ฐ ์๋ ํ๋์ ๋ด๋ฐ์ ๊ฐ์ง, ์์ค ํจ์๋ก ํ๊ท ์ ๊ณฑ ์ค์ฐจ๋ฅผ ์ฌ์ฉ
model = keras.models.Sequential([
keras.layers.Dense(30, activation="relu", input_shape=X_train.shape[1:]), keras.layers.Dense(1)])
model.compile(loss="mean_squared_error", optimizer="sgd")
history = model.fit(X_train, y_train, epochs=20, validation_data=(X_valid, y_valid))
mse_test = model.evaluate(X_test, y_test)
X_new = X_test[:3] # ์๋ก์ด ์ํ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
y_pred = model.predict(X_new)
[10.2.4] ํจ์ํ API๋ฅผ ์ฌ์ฉํด ๋ณต์กํ ๋ชจ๋ธ ๋ง๋ค๊ธฐ
- ์์ด๋&๋ฅ ์ ๊ฒฝ๋ง์ ์ ๋ ฅ์ ์ผ๋ถ ๋๋ ์ ์ฒด๊ฐ ์ถ๋ ฅ์ธต์ ๋ฐ๋ก ์ฐ๊ฒฐ๋๋ค.
- ๋ณต์กํ ํจํด๊ณผ ๊ฐ๋จํ ๊ท์น์ ๋ชจ๋ ํ์ตํ ์ ์๋ค.
# Concatenate ์ธต์ ๋ง๋ค๊ณ ๋ ๋ค์ ํจ์์ฒ๋ผ ํธ์ถํ์ฌ ๋๋ฒ์งธ ์๋์ธต์ ์ถ๋ ฅ๊ณผ ์
๋ ฅ์ ์ฐ๊ฒฐํ๋ค. ์
๋ ฅ์ด ๋ฐ๋ก ํธ์ถ๋จ
input_ = keras.layers.Input(shape=X_train.shape[1:])
hidden1 = keras.layers.Dense(30, activation="relu")(input_)
hidden2 = keras.layers.Dense(30, activation="relu")(hidden1)
concat = keras.layers.Concatenate()([input_, hidden2])
output = keras.layers.Dense(1)(concat)
model = keras.Model(inputs=[input_], outputs=[output])
- ๋ง์ฝ ์ผ๋ถ ํน์ฑ์ ์งง์ ๊ฒฝ๋ก๋ก ์ ๋ฌํ๊ณ , ๋ค๋ฅธ ํน์ฑ๋ค์ ๊น์ ๊ฒฝ๋ก๋ก ์ ๋ฌํ๊ณ ์ถ๋ค๋ฉด?
- ์๋ ์ฝ๋๋ 5๊ฐ์ ํน์ฑ์ ์งง์ ๊ฒฝ๋ก๋ก ๋ณด๋ด๊ณ 6๊ฐ์ ํน์ฑ์ ๊น์ ๊ฒฝ๋ก๋ก ๋ณด๋ธ๋ค๊ณ ๊ฐ์
input_A = keras.layers.Input(shape=[5], name="wide_input")
input_B = keras.layers.Input(shape=[6], name="deep_input")
hidden1 = keras.layers.Dense(30, activation="relu")(input_B)
hidden2 = keras.layers.Dense(30, activation="relu")(hidden1)
concat = keras.layers.concatenate([input_A, hidden2])
output = keras.layers.Dense(1, name="output")(concat)
model = keras.Model(inputs=[input_A, input_B], outputs=[output])
model.compile(loss="mse", optimizer=keras.optimizers.SGD(lr=1e-3))
X_train_A, X_train_B = X_train[:, :5], X_train[:, 2:]
X_valid_A, X_valid_B = X_valid[:, :5], X_valid[:, 2:]
X_test_A, X_test_B = X_test[:, :5], X_test[:, 2:]
X_new_A, X_new_B = X_test_A[:3], X_test_B[:3]
history = model.fit((X_train_A, X_train_B), y_train, epochs=20, validation_data=((X_valid_A, X_valid_B), y_valid))
mse_test = model.evaluate((X_test_A, X_test_B), y_test)
y_pred = model.predict((X_new_A, X_new_B))
- ๊ท์ ๊ธฐ๋ฒ์ ์ฌ์ฉํ MLP
- ๋ณด์กฐ ์ถ๋ ฅ์ ์ฌ์ฉํด ํ์ ๋คํธ์ํฌ๊ฐ ๋๋จธ์ง ๋คํธ์ํฌ์ ์์กดํ์ง ์๊ณ ๊ทธ ์์ฒด๋ก ์ ์ฉํ ๊ฒ์ ํ์ตํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
# ๊ท์ ๊ธฐ๋ฒ์ ์ฌ์ฉํ ๋ค์ธต ํ๊ท ํผ์
ํธ๋ก
# aux_output ๋ ์ด์ด๋ฅผ ์ถ๊ฐํ์ฌ regulation ํจ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
input_A = keras.layers.Input(shape=[5], name="wide_input")
input_B = keras.layers.Input(shape=[6], name="deep_input")
hidden1 = keras.layers.Dense(30, activation="relu")(input_B)
hidden2 = keras.layers.Dense(30, activation="relu")(hidden1)
concat = keras.layers.concatenate([input_A, hidden2])
output = keras.layers.Dense(1, name="output")(concat)
aux_output = keras.layers.Dense(1, name="aux_output")(hidden2)
model = keras.Model(inputs=[input_A, input_B], outputs=[output, aux_output])
# model compile์ ์ํํ ๋ ์ผ๋ง๋ regulation์ ํ ์ง ์ ํ ์ ์๋ค.
model.compile(loss=["mse", "mse"], loss_weights=[0.9, 0.1], optimizer="sgd")
# ๋ชจ๋ธ ํ๋ จ
# ์ฃผ ์ถ๋ ฅ๊ณผ ๋ณด์กฐ ์ถ๋ ฅ์ด ๊ฐ์ ๊ฒ์ ์์ธกํด์ผ ํ๋ฏ๋ก ๋์ผํ ๋ ์ด๋ธ์ ์ฌ์ฉํด์ผ ํ๋ค.
history = model.fit(
[X_train_A, X_train_B], [y_train, y_train], epochs=20, validation_data=([X_valid_A, X_valid_B], [y_valid, y_valid]))
# evaluate์ return value๋ก ์ด loss์ ๋๋ถ์ด ๊ฐ๋ณ loss๊น์ง ์ ๋ฌํ๋ค
total_loss, main_loss, aux_loss = model.evaluate(
[X_test_A, X_test_B], [y_test, y_test]
)
# Predict
y_pred_main, y_pred_aux = model.predict([X_new_A, X_new_B])
[10.2.6] ๋ชจ๋ธ ์ ์ฅ๊ณผ ๋ณต์
model = keras.models.Sequential([...]) # ๋๋ keras.Model([...])
model.compile([...])
model.fit([...])
model.save("my_keras_model.h5")
# ๋ชจ๋ธ ๋ก๋
model = keras.models.load_model("my_keras_model.h5")
[10.2.7] ์ฝ๋ฐฑ ์ฌ์ฉํ๊ธฐ
- ํ๋ จ์ ์์์ด๋ ๋์ ํธ์ถํ ๊ฐ์ฒด ๋ฆฌ์คํธ๋ฅผ ์ง์ ํ ์ ์๋ค.
- ์ํฌํฌ์ ์์์ด๋ ๋, ๊ฐ ๋ฐฐ์น ์ฒ๋ฆฌ ์ ํ์ ํธ์ถ ํ ์๋ ์๋ค.
[...] # ๋ชจ๋ธ์ ๋ง๋ค๊ณ ์ปดํ์ผํ๊ธฐ
checkpoint_cb = keras.callbacks.ModelCheckpoint("my_keras_model.h5")
history = model.fit(X_train, y_train, epochs=10, callbacks=[checkpoint_cb])
# ์กฐ๊ธฐ ์ข
๋ฃ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ
checkpoint_cb = keras.callbacks.ModelCheckpoint("my_keras_model.h5", save_best_only=True)
history = model.fit(X_train, y_train, epochs=10, validation_data=(X_valid, y_valid), callbacks=[checkpoint_cb])
model = keras.models.load_model("my_keras_model.h5") # ์ต์์ ๋ชจ๋ธ๋ก ๋ณต์
# ์กฐ๊ธฐ ์ข
๋ฃ๋ฅผ ๊ตฌํํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ : EarlyStopping ์ฝ๋ฐฑ
# ์ ํ์ ์ผ๋ก ์ต์์ ๋ชจ๋ธ์ ๋ณต์ ๊ฐ๋ฅ
# ์๊ฐ๊ณผ ์ปดํจํ
์์์ ๋ญ๋นํ์ง ์๊ธฐ ์ํด ์ง์ ์ด ์๋ ๊ฒฝ์ฐ ์ผ์ฐ ๋ฉ์ถ๋ ์ฝ๋ฐฑ์ ์ฌ์ฉ ๊ฐ๋ฅ
early_stopping_cb = keras.callbacks.EarlyStopping(patience=10, restore_best_weights=True)
history = model.fit(X_train, y_train, epochs=100, validation_data=(X_valid, y_valid), callbacks=[checkpoint_cb, early_stopping_cb])
# patience : ๋ฐ์ดํฐ๊ฐ ๋ ๋๋น ์ง๋ ๊ฒ์ ์ผ๋ง๋ ๋ฐ๋ณตํด์ผ early stopํ๋์ง๋ฅผ ๊ฒฐ์
# restore_best_weights : ํ๋ จ ์ข
๋ฃ ์ ๊ฐ์ฅ ์ฑ๋ฅ์ด ์ข์๋ ๋ชจ๋ธ์ weight๋ฅผ ๋ถ๋ฌ์จ๋ค
- EarlyStopping์ ๊ฒฝ์ฐ ๋ชจ๋ธ์ด ํฅ์๋์ง ์์ผ๋ฉด ํ๋ จ์ด ์๋์ผ๋ก ์ค์ง๋๊ธฐ ๋๋ฌธ์ ์ํฌํฌ์ ์ซ์๋ฅผ ํฌ๊ฒ ์ง์ ํด๋ ๋๋ค.
[10.3] ์ ๊ฒฝ๋ง ํ์ดํผํ๋ผ๋ฏธ๋ ํ๋ํ๊ธฐ
- ์กฐ์ ํ ํ์ดํผํ๋ผ๋ฏธํฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ์ด๋ค ์กฐํฉ์ด ์ต์ ์ธ์ง ์์์ผํ๋ค.
- GridSearchCV, RandomizedSearchCV๋ฅผ ์ฌ์ฉํด ํ์ดํผํ๋ผ๋ฏธํฐ ๊ณต๊ฐ์ ํ์ํ ์ ์๋ค.
- ์๋ ์ฝ๋๋ ์ผ๋ จ์ ํ์ดํผํ๋ผ๋ฏธํฐ๋ก ์ผ๋ผ์ค ๋ชจ๋ธ์ ๋ง๋ค๊ณ ์ปดํ์ผ ํ๋ ํจ์์ด๋ค.
def build_model(n_hidden=1, n_neurons=30, learning_rate=3e-3, input_shape=[8]):
model = keras.models.Sequential()
model.add(keras.layers.InputLayer(input_shape=input_shape))
for layer in range(n_hidden):
model.add(keras.layers.Dense(n_neurons, activation="relu"))
model.add(keras.layers.Dense(1))
optimizer = keras.optimizers.SGD(lr=learning_rate)
model.compile(loss="mse", optimizer=optimizer)
return model
# ์ ํจ์๋ฅผ ์ด์ฉํด KerasRegressor ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค.
keras_reg = keras.wrappers.scikit_learn.KerasRegressor(build_model)
keras_reg.fit(X_train, y_train, epochs=100, validation_data=(X_valid, y_valid), callbacks=[keras.callbacks.EarlyStopping(patience=10)])
mse_test = keras_reg.score(X_test, y_test)
y_pred = keras_reg.predict(X_new)
- ์๋ ์ฝ๋๋ RandomizedSearchCV๋ฅผ ํตํด ํ์ดํผํ๋ผ๋ฏธํฐ ํ์์ ์ํ
from scipy.stats import reciprocal
from sklearn.model_selection import RandomizedSearchCV
param_distribs = {
"n_hidden" : [0, 1, 2, 3]
"n_neurons" : np.arange(1, 100),
"learning_rate": reciprocal(3e-4, 3e-2)
}
rnd_search_cv = RandomizedSearchCV(keras_reg, param_distribs, n_iter=10, cv=3)
rnd_search_cv.fit(X_train, y_train, epochs=100, validation_data=(X_valid, y_valid),
callbacks=[keras.callbacks.EarlyStopping(patience=10)])
rnd_search_cv.best_params_
rnd_search_cv.best_score_
model = rnd_search_cv.best_estimator_.model
- RandomizedSearchCV๋ k-fold ๊ต์ฐจ ๊ฒ์ฆ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ X_valid์ y_valid๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค
- ํ์ดํผ ํ๋ผ๋ฏธํฐ ์ต์ ํ์ ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Hyperopt : ๋ชจ๋ ์ข ๋ฅ์ ๋ณต์กํ ํ์ ๊ณต๊ฐ์ ๋ํด ์ต์ ํ๋ฅผ ์ํํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Hyperas, kopt, Talos : ์ผ๋ผ์ค ๋ชจ๋ธ์ ์ํ ํ์ดํผํ๋ผ๋ฏธํฐ ์ต์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์ผ๋ผ์ค ํ๋ : ์ฌ์ฉํ๊ธฐ ์ฌ์ด ์ผ๋ผ์ค ํ์ดํผํ๋ผ๋ฏธํฐ ์ต์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Scikit-Optimize : ๋ฒ์ฉ ์ต์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Spearmint : ๋ฒ ์ด์ฆ ์ต์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Hyperband : ๋น ๋ฅธ ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Sklearn-Deap : ์งํ ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ฐ ํ์ดํผํ๋ผ๋ฏธํฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
[10.3.2] ์๋์ธต์ ๋ด๋ฐ ๊ฐ์
- ์
๋ ฅ์ธต๊ณผ ์ถ๋ ฅ์ธต์ ๋ด๋ฐ ๊ฐ์๋ ํด๋น ์์
์ ํ์ํ ์
๋ ฅ๊ณผ ์ถ๋ ฅ์ ํํ์ ๋ฐ๋ผ ๊ฒฐ์
- MNIST๋ 28*28๊ฐ์ ์ ๋ ฅ ๋ด๋ฐ๊ณผ 10๊ฐ์ ์ถ๋ ฅ ๋ด๋ฐ์ด ํ์
- ์ผ๋ฐ์ ์ผ๋ก ์ธต์ ๋ด๋ฐ ์ ๋ณด๋ค ์ธต ์๋ฅผ ๋๋ฆฌ๋ ์ชฝ์ด ์ด๋์ด ๋ง์
'AI > Machine Learning' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํธ์ฆ์จ ๋จธ์ ๋ฌ๋ 2ํ] Chapter 8 ์์ฝ (0) | 2022.12.03 |
---|---|
[ํธ์ฆ์จ ๋จธ์ ๋ฌ๋ 2ํ] Chapter 5 ์์ฝ (0) | 2022.11.29 |
[ํธ์ฆ์จ ๋จธ์ ๋ฌ๋ 2ํ] Chapter 4 ์์ฝ (1) | 2022.10.27 |
[ํธ์ฆ์จ ๋จธ์ ๋ฌ๋ 2ํ] Chapter 3 ์์ฝ (0) | 2022.10.26 |
[ํธ์ฆ์จ ๋จธ์ ๋ฌ๋ 2ํ] Chapter 3์ฅ ์ฐ์ต๋ฌธ์ ํ์ด (0) | 2022.10.23 |