๐ ๋จธ์ ๋ฌ๋
๐ญ XOR ์ค์ต
- XOR์ ์๋์ ๊ฐ์ ํน์ง์ ์ง๋๊ณ ์๋ค.
- ์ค์ต์ ํ์ํ ๊ฒ๋ค์ import ํด์ค๋ค.
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam, SGD
- ์ฐ๋ฆฌ๊ฐ ๋ง๋ค ๋ชจ๋ธ์ด XOR์ ๊ฐ์ ์ ๋๋ก ์ถ๋ ฅํ ์ ์๋์ง ์๊ณ ์ถ๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ์
๋ ฅ๊ฐ๊ณผ ์ถ๋ ฅ๊ฐ์ ์ ํด์ฃผ์๋ค. ์ถ๊ฐ์ ์ผ๋ก keras๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ float32๋ก ๋ฐ์ดํฐ์ ํ์
์ ์ค์ ํด ์ฃผ์๋ค.
x_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=np.float32)
y_data = np.array([[0], [1], [1], [0]], dtype=np.float32)
- ์ด์ง ๋
ผ๋ฆฌ ํ๊ท
- ์ฐ์ ,
์ด์ง ๋
ผ๋ฆฌ ํ๊ท
๋ฅผ ์ฌ์ฉํด ๋ชจ๋ธ์ ์์ฑํด๋ณด๊ธฐ๋ก ํ๋ค.
- ๊ฒฐ๊ณผ์ ์ผ๋ก,
์ด์ง ๋
ผ๋ฆฌ ํ๊ท
๋ฅผ ํตํด XOR์ ๊ฐ์ ์ ๋๋ก ์ถ๋ ฅํ ์ ์๋ ๋ชจ๋ธ์ ์์ฑ ๋ถ๊ฐ๋ฅํ๋ค.
- ๋ชจ๋ธ์ ํผํ
ํ๋ ๊ณผ์ ์์ epoch์ 1000์ผ๋ก ์ค์ ํ์๊ณ , ์ด ๊ฒฝ์ฐ ๋ชจ๋ ๊ฒฐ๊ณผ๊ฐ์ ์ถ๋ ฅํ๊ฒ ๋๋ฉด 1000๊ฐ๊ฐ ์ถ๋ ฅ๋๋ฏ๋ก
verbose
๋ฅผ 0
์ผ๋ก ์ธํ
ํด ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ์ ๋ง์๋ค. (vervose=1
์ด๋ฉด ํ์ต๊ฒฐ๊ณผ ์ถ๋ ฅํจ)
model = Sequential([
Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy', optimizer=SGD(lr=0.1))
model.fit(x_data, y_data, epochs=1000, verbose=0)
- ํ์ตํ ๋ชจ๋ธ์ ๋ํ ๊ฒฐ๊ณผ๊ฐ์ ์์ธกํด ๋ณด์๋ค.
- ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฐ์
0 1 1 0
์ด๋ค. ์๋์ ๊ฒฐ๊ณผ๊ฐ์ ๋ณด๋ฉด ๋ณ๋ก ๊ทผ์ ํ์ง ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ๋ฐ๋ผ์ ํด๋น ๋ชจ๋ธ์ ์คํจ๋ค.
y_pred = model.predict(x_data)
print(y_pred)
- XOR ๋ฅ๋ฌ๋(MLP)
- ํ์ํ ๊ฒ๋ค์ import ํ์์ผ๋ ๋ฐ๋ก ๋ชจ๋ธ์ ์์ฑํ๊ฒ ๋ค.
- ํ์ฌ ๋ง๋๋ ค๊ณ ํ๋ ๋ชจ๋ธ์
Multilayer Perceptrons
์ผ๋ก ์ด์ง ๋
ผ๋ฆฌ ํ๊ท์ ๊ฒฝ์ฐ์ ๋ฌ๋ฆฌ ์ฌ๋ ค ๊ฒน์ ๋ ์ด์ด๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
relu
ํจ์๋ฅผ ํ์ฑํํจ์๋ก ์ฌ์ฉํ๋ค.
0๋ณด๋ค ์์ ๊ฐ์ด ๋ค์ด์ค๋ฉด 0์ผ๋ก ์ถ๋ ฅํ๊ณ (y=0
), 0๋ณด๋ค ํฐ ๊ฐ์ด ๋ค์ด์ค๋ฉด ์
๋ ฅ๊ณผ ๋๊ฐ์ ๊ฐ์ ๋ด๋ ๊ทธ๋ํ(y=x
)
model = Sequential([
Dense(8, activation='relu'),
Dense(1, activation='sigmoid'),
])
model.compile(loss='binary_crossentropy', optimizer=SGD(lr=0.1))
model.fit(x_data, y_data, epochs=1000, verbose=0)
- ๋ชจ๋ธ์ ์์ฑํ์ผ๋ ๋ชจ๋ธ์ ํตํด ๊ฒฐ๊ณผ๋ฅผ ์์ธกํด ๋ณด๋๋ก ํ๊ฒ ๋ค.
- ์ฐ๋ฆฌ๊ฐ ์ํ๋
0 1 1 0
๊ณผ ์ ์ฌํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์๋ค.
y_pred = model.predict(x_data)
print(y_pred)
- Keras Functional API
Sequential API
๋ ์์ฐจ์ ์ธ ๋ชจ๋ธ ์ค๊ณ์๋ ํธ๋ฆฌํ API ์ด์ง๋ง, ๋ณต์กํ ๋คํธ์ํฌ๋ฅผ ์ค๊ณํ๊ธฐ์๋ ํ๊ณ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ค๋ฌด์์๋ Functional API
๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ฏ๋ก ํด๋น ์ค์ต์ ์งํํด ๋ณด์๋ค.
Functional API
๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํ์ํ ๊ฒ๋ค์ import ํ์๋ค.
import numpy as np
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Dense, Input
from tensorflow.keras.optimizers import Adam, SGD
Functional API
๋ฅผ ์ฌ์ฉํด ๋ชจ๋ธ์ ์์ฑํด๋ณด์๋ค.
hidden layer
๋ฅผ ์ฌ์ฉํ์์ผ๋ฉฐ, relu
๋ฅผ ํ์ฑํ ํจ์๋ก ์ฌ์ฉํ๋ค.
- ๋งจ ์์์ ์ ์ธํ input ๋ณ์๊ฐ ๋ค์ ์ค hidden์ ๋งจ ๋ง์ง๋ง์ ์ ์ฉ๋๋ฉฐ, hidden์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ธ ๊ฒ์ ์ ์ ์๋ค.
- argument๋ช
์ธ
inputs
์ ๊ฒฝ์ฐ 2๊ฐ ์ด์์ด ๋ค์ด๊ฐ๊ณ (์ค์ ๋ก 2๊ฐ ๋ค์ด๊ฐ) outputs
์ ๊ฒฝ์ฐ ์ฌ๋ฌ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ์จ์ผ ํ๋ค.
- ์ด์ง ๋
ผ๋ฆฌ ํ๊ท์ ๊ฒฝ์ฐ์ ๋ค๋ฅด๊ฒ
Model
์ ์ฌ์ฉํด ๋ชจ๋ธ์ ์ ์ธํ๋ค.
model.summary()
๋ฅผ ํตํด ๋ชจ๋ธ์ ๊ฐ์๋ฅผ ์ ์ ์๋ค.
input = Input(shape=(2,))
hidden = Dense(8, activation='relu')(input)
output = Dense(1, activation='sigmoid')(hidden)
model = Model(inputs=input, outputs=output)
model.compile(loss='binary_crossentropy', optimizer=SGD(lr=0.1))
model.summary()
<summary ๊ฒฐ๊ณผ>
- input์ ๊ฒฝ์ฐ
Output Shape
์ 2๊ฐ ์จ์๋๋ฐ input์ด 2๊ฐ๊ฐ ๋ค์ด๊ฐ๋ค๋ ๋ป์ด๋ค.
dense
์ ๊ฒฝ์ฐ(hidden layer
)๋ 8๊ฐ๊ฐ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ์ ๋ ๊ฒ ์ฐ๊ณ output layer
์ ๊ฒฝ์ฐ๋ 1๊ฐ ์ด๊ธฐ ๋๋ฌธ์ ์ ๋ ๊ฒ ๋์ด
- ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ ๋ฐ๋ก
'None'
์ธ๋ฐ, ์ด๊ฒ์ batch size
์ด๋ค.
๋ด๊ฐ ์ ํ๊ธฐ ๋๋ฆ
์ด๊ธฐ ๋๋ฌธ์ ์ ๋ ๊ฒ ์ฐ์
- ํ๋ผ๋ฏธํฐ์ ๊ฐ์์ ์ด ๊ฐ์๋ ๋์ด
Non-trainable params
: ๋ณดํต dropout ์ด๋ normalization layer๋ค์ด ํธ๋ ์ด๋์ ์ํด์ ์ฌ๊ธฐ์ ๋ํ๋๊ฒ ๋จ
- ์์ฑ๋ ๋ชจ๋ธ์ ํตํด ๊ฒฐ๊ณผ๊ฐ ์์ธก์ ์งํํด ๋ณด์๋ค.
model.fit(x_data, y_data, epochs=1000, verbose=0)
y_pred = model.predict(x_data)
print(y_pred)
๐ญ ์์ด ์ํ๋ฒณ ์ํ ๋ฐ์ดํฐ์
์ค์ต
- ์ด๋ฏธ์ง๊ฐ ์์ด ์๋๊ฐ ์ข ๋๋ฆด ์ ์๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ์ธํ
์ ํ์๋ค.
[๋ฐํ์] - [๋ฐํ์ ์ ํ ๋ณ๊ฒฝ] - [ํ๋์จ์ด ๊ฐ์๊ธฐ] GPU ์ ํ - [์ ์ฅ]
- kaggle์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ์ ๋ณด ์
๋ ฅ์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ์
์ ์์ถ์ ํด์ ํ์๋ค.
import os
os.environ['KAGGLE_USERNAME'] = 'username'
os.environ['KAGGLE_KEY'] = 'key'
!kaggle datasets download -d datamunge/sign-language-mnist
!unzip sign-language-mnist.zip
- ๋ค์๊ณผ ๊ฐ์ด import๋ฅผ ์งํํ์๋ค.
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.optimizers import Adam, SGD
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import OneHotEncoder
- ์ด๋ฒ ๋ฐ์ดํฐ์
์ train_set๊ณผ test_set์ด ๊ฐ๊ฐ ๋ฐ๋ก ์กด์ฌํ๋ค. ๋จผ์ train_set์ ์ ์ฉํ๋๋ก ํ๊ฒ ๋ค.
train_df = pd.read_csv('sign_mnist_train.csv')
train_df.head()
- test_set์ ์ ์ฉํ์๋ค.
test_df = pd.read_csv('sign_mnist_test.csv')
test_df.head()
- ์ฐ๋ฆฌ๊ฐ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ์ป์ด์ผ ํ๋ ์ ๋ณด๋ ์ํ๋ฒณ์ ๋ํ๋ด๋
label
์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋จผ์ label
์ด ์ด๋ป๊ฒ ๋ถํฌ๋์ด ์๋์ง ํ์ธํด๋ณด๋๋ก ํ๊ฒ ๋ค.
- 9=J or 25=Z ๋ ๋์์ด ๋ค์ด๊ฐ๋ฏ๋ก ์ ์ธํ์๋ค.
-> ์ฆ ์ํ๋ฒณ์ด 26๊ฐ์ง๋ง, ํ ๋ฐ์ดํฐ์
์๋ 24๊ฐ ๋ค์ด๊ฐ์์!
- ํ์ฌ label์ ๊ณจ๊ณ ๋ฃจ ๋ถํฌ๋์ด ์๋ ๊ฒ์ ์ ์ ์๋ค.
plt.figure(figsize=(16, 10))
sns.countplot(train_df['label'])
plt.show()
- ๋ฐ์ดํฐ์
์ ๋ถ๋ฆฌ๋ฅผ ์งํํ์๋ค.
train_df = train_df.astype(np.float32)
x_train = train_df.drop(columns=['label'], axis=1).values
y_train = train_df[['label']].values
test_df = test_df.astype(np.float32)
x_test = test_df.drop(columns=['label'], axis=1).values
y_test = test_df[['label']].values
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
- ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ๋ณด๊ธฐํด๋ณด์๋ค.
- ๋งจ ์์ ํ๋ฅผ ๋ณด๋ฉด ์๊ฒ ์ง๋ง, ์ฐ๋ฆฌ๋ ์ด๋ฏธ์ง ํฝ์
์ ๋์
๋๋ ๊ฐ ๊ฐ์ ํ ์ค๋ก ๊ฐ์ง๊ณ ์๋ค. ํ์ง๋ง ์ด๋ฏธ์ง๋ก ๋ณด์ฌ์ง๊ฒ ํ๋ ค๋ฉด 2์ฐจ์์ผ๋ก ๋ณ๊ฒฝํด์ฃผ์ด์ผ ํ๋ค. ๋ฐ๋ผ์ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๊ฐ 784 ์ด๋ฏ๋ก ๊ฐ
28 x 28
๋ก ๋ง๋ค์ด ์ฃผ์๋ค.
index = 1
plt.title(str(y_train[index]))
plt.imshow(x_train[index].reshape((28, 28)), cmap='gray')
plt.show()
- ์์ label์ countplot์ผ๋ก ๊ทธ๋ฆฐ ๋ถ๋ถ์ ๋ณด๋ฉด ๊ฐ label์ ์ซ์๊ฐ 1์์ 24๊น์ง์ธ ๊ฒ์ ์ ์ ์๋ค. ์ฐ๋ฆฌ๋ ์ด ์ซ์๋ค์ ์ปดํจํฐ๊ฐ ์ดํดํ๊ธฐ ์ฝ๊ฒ ํด์ฃผ๋ ค๊ณ
OneHotEncoding
์ ์งํํ์๋ค.
- ์ํซ์ธ์ฝ๋ฉ์ ํตํด ๊ฐ label๋ค์ ๊ฐ์ด
0 ~ 1
์ฌ์ด์ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ๋์๋ค.
- ์ด ์์
์ ๊ฑฐ์น๊ณ ๋ฐ๋ก ์์ ์ฌ์ง์ ๋ค์ ๊ฐ์ ธ์๋ณด๋ฉด ์๋์ ๊ฐ์ด ๋ณํ๊ฒ ๋๋ค.
encoder = OneHotEncoder()
y_train = encoder.fit_transform(y_train).toarray()
y_test = encoder.fit_transform(y_test).toarray()
print(y_train.shape)
- ์ด๋ฏธ์ง ๋ฐ์ดํฐ ๋ํ
0 ~ 255
์ฌ์ด์ ๊ฐ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ 255๋ฅผ ๋๋์ด์ค ์ผ๋ฐํ์ํค๋ ์์
์ ์งํํ์๋ค.
x_train = x_train / 255.
x_test = x_test / 255.
- ๋คํธ์ํฌ๋ฅผ ๊ตฌ์ฑํด ์ฃผ์๋ค.
input = Input(shape=(784,))
hidden = Dense(1024, activation='relu')(input)
hidden = Dense(512, activation='relu')(hidden)
hidden = Dense(256, activation='relu')(hidden)
output = Dense(24, activation='softmax')(hidden)
model = Model(inputs=input, outputs=output)
model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.001), metrics=['acc'])
model.summary()
- ์์ฑ๋ ๋ชจ๋ธ์ ํ์ต์ ์งํํ์๋ค.
history = model.fit(
x_train,
y_train,
validation_data=(x_test, y_test),
epochs=20
)
plt.figure(figsize=(16, 10))
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.figure(figsize=(16, 10))
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
๐ญ 3์ฃผ์ฐจ ์์
3์ฃผ์ฐจ ์์