์ค์ต์ฉ ์ฌ์ดํธ๋ก ์ ํํ ๋ฐ์ด์ฝ์์ MNIST๋ฅผ ํผ์ ํ์ผ๋ก ํด๊ฒฐํด๋ด์ผ์ง ํ๋ ํจ๊ธฐ์ ํจ๊ป ์ ์ถํ ๋ต์์ ๊ฒฐ๊ณผ๋ค.
์ฒซ๋ฒ์งธ ์๋ ํ ?? ์ถ์ด์ ๋๋ฒ์งธ ํ์ผ์ ์ ์ถํ๋๋ฐ 10%๋ ์๋๋ ์ ํ๋์ ๋จธ๋ฆฌ๊ฐ ์์ฐ-
ํ์ง๋ง! 3์ผ ๋์ ๋ถ์ก๊ณ ์๋ ๊ฒฐ๊ณผ 0.981๊น์ง ์ ํ๋๋ฅผ ์ฌ๋ฆด ์ ์์๊ณ ํ๋ณตํ ๋ง์์ผ๋ก ์ฝ๋๋ฅผ ๋ถ์ํด๋ณด๊ณ ์ ํ๋ค.
์ฒ์ฐธํ ์ ํ๋์ ์์ธ๋ ๋๋ฆ๋๋ก ์ด์ฌํ ๋ถ์ํ ์์ ์ด๋ผ ๋๊ตฐ๊ฐ์๊ฒ๋ ์ ์ตํ ๊ธ์ด ๋๊ธฐ๋ฅผ ๋ฐ๋ผ๋ฉด์!
๐ ๋ฐ์ดํฐ ํ์ธ
โ train.csv: ํฝ์ ๊ฐ๊ณผ ์ด๋ฏธ์ง๊ฐ ๋ณด์ฌ์ฃผ๋ ์ซ์ ๊ฐ
โก test.csv: ํฝ์ ๊ฐ
โข sample_submission.csv: ์ ์ถ ํ์ผ์ ์์
โจ ๋ชฉํ
test.csv์ ํฝ์ ๊ฐ์ผ๋ก ๊ฐ ์ธ๋ฑ์ค์ ๋ ์ด๋ธ(์ซ์) ์์ธกํ๊ธฐ
๐ ์ฝ๋ ๋ถ์
import tensorflow as tf
import numpy as np
import pandas as pd
#import matplotlib.pyplot as plt
from tensorflow import keras
#from sklearn.model_selection import train_test_split
์ฃผ์ ์ฒ๋ฆฌํ ๋ชจ๋์ ํ์์ ๋ฐ๋ผ ์ฌ์ฉํ๋ฉด ๋๋ ๋ถ๋ถ์ด๋ค.
from google.colab import drive
drive.mount('/gdrive', force_remount=True)
์ฝ๋ฉ ํด๋์ ๋ฐ์ดํฐ ํ์ผ์ ์ฌ๋ ค๋จ๋๋ ๋ฐํ์ ์ฐ๊ฒฐ์ด ์ ์ง๋์ ๋๋ง ํ์ผ์ ์ฌ์ฉํ ์ ์๊ธธ๋ ๋๋ผ์ด๋ธ์ ์ฌ๋ ค๋๊ณ ๊ณ์ ์ฐ๋ ค๊ณ ์ธํ ํด์คฌ๋ค.
train = pd.read_csv("/gdrive/My Drive/train.csv").iloc[:, 1:]
test = pd.read_csv("/gdrive/My Drive/test.csv").iloc[:, 1:]
submission = pd.read_csv("/gdrive/My Drive/sample_submission.csv")
๋ฐ์ดํฐ ์ฝ์ด์ค๊ธฐ
print(train.shape)
print(test.shape)
# (60000, 786): 60000๊ฐ์ ํ, 786๊ฐ์ ์ด
# (10000, 785): 10000๊ฐ์ ํ, 785๊ฐ์ ์ด
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ฐ์ดํฐ์ ๊ตฌ์ฑ ํํ๋ฅผ ํ์ธํด๋ดค๋ค.
x_train = train.drop(["label"], axis=1)
x_test = test
y = train["label"]
train ๋ฐ์ดํฐ๋ ์์์ ํ์ธํ ๊ฒ์ฒ๋ผ ์ด์ด 786๊ฐ์ด์ง๋ง ๋ชจ๋ ์ด์ ์ฌ์ฉํ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ ์์ธกํด์ผ ํ ๊ฐ์ธ label ์ด์ ์ญ์ ํ๊ณ , test ๋ฐ์ดํฐ๋ ์ด๋ฏธ ํฝ์ ๊ฐ๋ง ์ ์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ๊ฐ๊ณต ์์ด ๊ทธ๋๋ก ์ฌ์ฉํ๋ค.
# ๊ฐ์ธ์ ์ผ๋ก ๊ฐ์ฅ ํค๋งธ๋ ๋ถ๋ถ
x_train = x_train[0:50000]
x_val = x_train[50000:60000]
y_train = y[0:50000].to_numpy()
y_val = y[50000:60000].to_numpy()
ํ์ต ๋ฐ์ดํฐ๋ 50000๊ฐ, ๊ฒ์ฆ ๋ฐ์ดํฐ๋ 10000๊ฐ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค.
reshape๋ ๋ช๋ช ํจ์๋ค์ด ๋ฐ์ดํฐํ๋ ์ ํํ์์๋ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ to_numpy ํจ์๋ฅผ ์ด์ฉํด numpy ํํ๋ก ๋ฐ๊ฟ์ค๋ค. to_numpy ํจ์๋ฅผ ์ฐ์ง ์์๋ ์ฝ๋๊ฐ ์ ๋์๊ฐ๋ค๋ฉด ๊ตณ์ด ์ธ ํ์๋ ์๋๋ฐ ๋๋ 'ndarray.~๋ ํจ์๋ช ์์๊ฐ ์๋ค'๋ ์๋ฌ๊ฐ ๋ ์ ๋ฐ๊ฟ์คฌ๋ค.
# ์ ๊ทํ
x_train = x_train.astype('float32') / 255
x_val = x_val.astype('float32') / 255
x_test = x_test.astype('float32') / 255
csv ํ์ผ์ ์ ์ฅ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ค์ 0~255์ ์์๊ฐ ํํ๋ก ์ ์ฅ๋์ด ์๋๋ฐ ํ์ต์ ์ํด 0~1 ์ฌ์ด์ ๊ฐ์ผ๋ก ์ ๊ทํ์์ผ์ค๋ค.
y_train = tf.keras.utils.to_categorical(y_train, num_classes=10)
y_val = tf.keras.utils.to_categorical(y_val, num_classes=10)
y_train, y_val ๊ฐ์ to_categorical ํจ์๋ฅผ ์ด์ฉํด one-hot ์ธ์ฝ๋ฉ ์์ ์ ํด์ค๋ค. num_classes๊ฐ 10์ธ ์ด์ ๋ ์ซ์ ๋ ์ด๋ธ์ด 0~9๋ก ์ด 10๊ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(10, activation='softmax')
])
๋ชจ๋ธ์ ๋ง๋๋ ๋จ๊ณ๋ก ๊ต์ฅํ ๊ฐ๋จํ ์ ํ ๋ชจ๋ธ์ ๋ง๋ค์๋ค. Flatten ํจ์๋ฅผ ์ด์ฉํด์ ์ ๋ ฅ์ด 28*28์ธ ์ด๋ฏธ์ง๋ฅผ 1์ฐจ์ ํํ๋ก ๋ง๋ค์ด์ฃผ๊ณ Dense๋ฅผ ์ด์ฉํด ์ ์ถ๋ ฅ์ ์ฐ๊ฒฐํด์ฃผ๋๋ฐ ์ด ๋ Dense layer์ ์๋ ์์ ๋กญ๊ฒ, activation์ ๊ผญ relu์ softmax๋ฅผ ์ฌ์ฉํ ํ์๋ ์๋ค.
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
์ตํฐ๋ง์ด์ ์ ์์ค ํจ์, ํ๊ฐ ์งํ์ ๋ํด ์ง์ ํด์ค๋ค.
model.fit(x_train, y_train, epochs=10)
epoch 10๋ฒ์ผ๋ก ํ์ต ์์
y_pred = np.argmax(model.predict(x_test), axis=1)
test.csv์ ๊ฐ์ผ๋ก ์ซ์ ๋ ์ด๋ธ์ ์์ธกํ๊ธฐ ์ํด predict ํจ์์ input์ผ๋ก x_test๋ฅผ ๋ฃ์ด์ค๋ค.
์ฐ๋ฆฌ๊ฐ ํ์๋ก ํ๋ ๊ฐ์ 0~9 ์ธ๋ฑ์ค์ ํด๋นํ๋ ๊ฐ์ด ์๋๋ผ ์ธ๋ฑ์ค ๊ทธ ์์ฒด์ด๊ธฐ ๋๋ฌธ์ ์ต๋๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ np.argmax ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
# ์์ธก๊ฐ์ submisson ํ์ผ์ label ์ด์ ํ ๋น
submission['label'] = y_pred
# ์ต์ข
์ ์ถ ํ์ผ ์์ฑ
submission.to_csv("/content/submission.csv", index=False)
๐ฅ ์ด๋ ค์ ๋ ์
1. train, test, val ๋ฐ์ดํฐ ์์ฑ
์ผ๋ผ์ค์์ ์ ๊ณตํด์ฃผ๋ mnist ๋ฐ์ดํฐ๋ load_data ํจ์๋ฅผ ์ด์ฉํ๋ฉด ์์์ x_train, x_test / y_train, y_test ๊ฐ์ ๊ฐ์ ธ์ค๋๋ฐ csv ํ์ผ์์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด์ค์ผ ํ๋ ๋ถ๋ถ์ด ๋๋ฌด ์ด๋ ค์ ๋ค. ์ด๋ก ๊ณต๋ถ๋ฅผ ํ๋ฉด์ ๋ดค๋ ๊ฐ์๋ค์ด๋ ๊ตฌ๊ธ๋ง ๊ฒฐ๊ณผ๋ก ๋์จ ๊ธ๋ค๋ ์ผ๋ผ์ค ์ ๊ณต mnist ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๊ธฐ ๋๋ฌธ์ train ๋ฐ์ดํฐ๋ 50000๊ฐ, val ๋ฐ์ดํฐ๋ 10000๊ฐ๋ก ๋๋ ์ค์ผ ํ๋ ๋ถ๋ถ์์ ๊ฐ์ ์์ ์ก์ง ๋ชปํ๋ค.
2. y ๊ด๋ จ ๋ฐ์ดํฐ์ to_categorical() ํจ์ ์ ์ฉ
to_categorical ํจ์๊ฐ ์-ํซ ์ธ์ฝ๋ฉ์ ์์์ ํด์ฃผ๋๊ตฌ๋ ์ ๋๋ง ์๊ณ ์๋ ์ํ์์ ์จ๋ณด๋ ค๊ณ ํ๋๊น ์ ์ฐ๋ ๊ฑฐ๊ณ ์ธ์ ์จ์ผํ๋์ง๋ฅผ ํ์คํ๊ฒ ๋ชฐ๋ผ์ ์ฌ๊ธด๊ฐ? ์ถ์ ๊ณณ์๋ ๋ค ๋ฃ์๋ ๊ฒ ๊ฐ๋ค.
3. np.argmax ์ฌ์ฉ
์ฌ๋๋ฒ์งธ ์๋๊น์ง๋ np.argmax๋ฅผ ์ฌ์ฉํ์ง ์์๋ค. ๊ฐ ํฝ์ ๊ฐ์ ์ ๊ทํํ๋ค๊ณ 255๋ก ๋๋ ๋ชซ์ด ๋ฐฐ์ด์ ๋ค์ด๊ฐ๋๊น ์ฐพ์์ผ ํ๋ ์ธ๋ฑ์ค ๊ฐ๊ณผ ์๊ด์๋ ๊ฐ๋ง ๊ณ์ y_pred์ ์ ์ฅ์ด ๋๋ ๊ฑฐ์๋ค.
๐ ๊ฒฐ๊ณผ ๋ฐ ๊ฐ์
์์ ์ฝ๋๋ก ์ ์ถํ ๊ฒฐ๊ณผ๋
0.0065์์ 0.9778๋ก ์ฅ์กฑ์ ๋ฐ์ ! ์ข ๋ ์ ํ๋๋ฅผ ๋์ฌ๋ณด๊ณ ์ถ์ด์ Batch ์ ๊ทํ์ ๋๋กญ์์์ ์ถ๊ฐํด๋ณด์๋ค.
1) Batch ์ ๊ทํ & ๋๋กญ์์
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation='relu'),
keras.BatchNormalization(),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dropout(0.5),
keras.layers.Dense(10, activation='softmax')
])
์ ํ๋๋ 0.981์ด์๋ค.
2) ๋๋กญ์์๋ง ์ฌ์ฉ
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dropout(0.5),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dropout(0.5),
keras.layers.Dense(10, activation='softmax')
])
์ ํ๋๋ 0.9718์ด์๋ค.
๋ฐฐ์น ์ ๊ทํ์ ๋๋กญ์์์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ ํ์ต์ ์ข๋ค๋๋ผ ํ๋ ๊ฒ๋ง ๊ณต๋ถํ๋ค๊ฐ ์ง์ ํด๋ณด๋๊น ์ ๋ง ๊ทธ๋ฌ๋ค. ๊ณต๋ถํ ๋ด์ฉ์ ๋์ผ๋ก ํ์ธํ ์ ์์๋ ์์ฃผ ์์คํ ๊ฒฝํ์ด์๊ณ MNIST๋ ์ด๋ ๊ฒ ๋ง๋ฌด๋ฆฌ-!
'๐ฉโ๐ป' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ART] adversarial_training_mnist.ipynb ์ฝ๋ ๋ถ์ (0) | 2022.01.12 |
---|---|
[ART] ART for TensorFlow v2 - Callable ์ฝ๋ ๋ถ์ (0) | 2022.01.03 |
[ART] ART for TensorFlow v2 - Keras API ์ฝ๋ ๋ถ์ (0) | 2021.12.31 |
[kaggle] Intermediate Machine Learning (0) | 2021.04.28 |
[kaggle] Intro to Machine Learning (0) | 2021.04.26 |