colab.research.google.com/drive/1vcBfl192NDGJ2_c2u01tAa65NGSJmrw8?usp=sharing
์๋ฌธ์ ๋๋ค. ์ฝ๋ฉ์ผ๋ก ๋ณด๋๊ฑฐ ์ถ์ฒ.
%tensorflow_version
#ํ
์ํ๋ก์ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น๋์ด์๋์ง ํ์ธ.
import keras
์ผ๋ผ์ค๋ ํ ์ํ๋ก๋ฅผ ์ด์ฉํ๊ธฐ ๋ ์ฝ๊ฒ๋ง๋ค์ด์ฃผ๋ ๋๊ตฌ์.
์ฌ์ธต ์ ๊ฒฝ๋ง์ ๋ง๋ค๊ธฐ ์ํ ํ ์ํ๋ก, ํ ์๋ ธ, CNTK์ ๊ฐ์ ๋๊ตฌ๋ฅผ ๋์ฑ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ฃผ๋ ๋๊ตฌ์.
๋ฐ๋ผ์ ์ผ๋ผ์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ ํ ์ํ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ๋ฌ์จ ์ํ์ฌ์ผํจ.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.datasets import mnist
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
๊ธฐ๋ณธ์ ์ธ ์ธ๊ณต ์ ๊ฒฝ๋ง์ ๋ ์ด์ด๊ฐ ์์ฐจ์ ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์.
์ด๋ ๊ฒ ์์ฐจ์ ์ธ ์ ๊ฒฝ๋ง์ ๊ตฌ์ฑํ ๋ ์ฌ์ฉํ ์ ์๋ ํจ์๊ฐ ์ผ๋ผ์ค์ ๋ชจ๋ธ ๋๊ตฌ ์ค ์ํ์ ๋ชจ๋ธ ํจ์์.
Dense๋ ์ ๊ฒฐํฉ์ธต(fully-cinnected layer)์ ์๋ฏธ.
์ ๋ ฅ์ธต ์๋์ธต ์ถ๋ ฅ์ธต๊ณผ ๊ฐ์ ๊ฐ ์ธต์ด ์์๋, ๊ทธ ์ธต๊ณผ ๋ฐ๋ก ์์ ์ธต๊ณผ ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒ์ด ์ ๊ฒฐํฉ์ธต์ด๋ผํจ.
Dense๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๋ ์ด์ด์ ๋ด๋ฐ ๊ฐ์๋ฅผ ์ค์ ํ ์ ์๊ณ ,
Activation์ ํ์ฑํ ํจ์๋ฅผ ์๋ฏธํจ.
from tensorflow.keras.utils import to_categorical
์ ํธ ๋๊ตฌ์ค์ to_categorical๋ผ๋ ํจ์๋ฅผ ๋ถ๋ฌ์ค๋ ๋ช ๋ น์ด๋ก, ์-ํซ ์ธ์ฝ๋ฉ์ ๊ตฌํํ ์ ์๋ ํจ์์.
์ฌ๊ธฐ์ one-hot incoding์ ํ๋์ ๊ฐ๋ง 1๋ก ๋ํ๋ด๊ณ ๋๋จธ์ง ๊ฐ๋ค์ ์ ๋ถ 0 ์ผ๋ก ํ์ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ ๋ต๋ ์ด๋ธ์ ์ฒซ๋ฒ์งธ, ๋๋ฒ์งธ, ... ์ ๊ฐ์ด ์์๋ก ๋ํ๋ด๋๋ก ๋ฐ์ดํฐ์ ํํ๋ฅผ ๋ฐ๊พธ๋ ๊ฒ.
์ผ๋ผ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฅ๋ฌ๋ ๋ชจ๋ธ ๊ฐ๋ฐ์ ์ฐ์ตํ ์ ์๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ๊ฐ ์์.
๊ทธ ๋ฐ์ดํฐ๋ค์ ๋ฐ์ดํฐ์ ๋๊ตฌ(datasets)์ ์๊ณ , mnist๋ ๊ทธ ๋ฐ์ดํฐ์ ์ค์ ์ง์ ์์ผ๋ก ์ด ์ซ์ db๋ฅผ ๋ถ๋ฌ์ค๋ ๋ช ๋ น์ด์.
mnist๋ ํ๋ จ๋ฐ์ดํฐ์ ๊ฒ์ฆ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ๋์ด์์.
numpy๋ ์ํ, ๋ฐฐ์ด๋ฑ ๊ณ์ฐ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
as๋ ์์ผ๋ฆฌ์ด์ฑ์ผ๋ก ๋ณ๋ช ๋ณ์นญ์. ์์ผ๋ก numpy๋ผ๊ณ ์ฐ์ง์๊ณ np๋ผ ๋ถ๋ฅด๊ฒ ๋ค๋ ๋ป์.
matplotlib๋ ๊ทธ๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์.
๋ง๋๊ทธ๋ํ๋ ๊บฝ์์ ๊ทธ๋ํ, ํ์คํ ๊ทธ๋จ๋ฑ ๋ค์ํ ๊ทธ๋ํ๋ฅผ ์ฝ๊ฒ ๊ทธ๋ฆด ์ ์๊ฒ ๋ง๋ ํจ์๋ก, ๊ทธ ์ค์์ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ pyplot์ ์ฌ์ฉํ๊ณ ์ด๊ฑธ plt๋ผ ๋ถ๋ฅด๊ฒ ๋ค๋ ๋ป์.
(x_train, y_train), (x_test, y_test) = mnist.load_data()
print(x_train.shape)
print(y_train.shape)
print(x_test.shape)
print(y_test.shape)
load_data() ๋ mnist ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ผ๋ ๋ช ๋ น์.
mnist ๋ฐ์ดํฐ๋ 4๋ถ๋ถ์ผ๋ก ๋๋์ด์ ธ ์์.
์ด ๊ฐ๋ค์ numpy ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ดํํ(shape)๋ก ๊ฐ์ ธ์ด.
train ์ ํ๋ จ๋ฐ์ดํฐ, test๋ ๊ฒ์ฆ๋ฐ์ดํฐ๋ฅผ ๋ปํ๋ ๋ณ์์.
x_train์๋ 6๋ง๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์๊ณ , ๊ฐ ๊ทธ๋ฆผ์ ํฝ์ ์ด ๊ฐ๋ก์ ์ธ๋ก๊ฐ 28๊ฐ์ฉ ์์.
ํ๋ จ ๋ฐ์ดํฐ์ ๊ฒ์ฆ ๋ฐ์ดํฐ์๋ ์๊ธ์จ ๊ทธ๋ฆผ๊ณผ ๊ทธ ๊ทธ๋ฆผ์ด ๋ฌด์จ ์ซ์์ธ์ง(์ ๋ต)์ด ๊ฐ์ด ๋ค์ด์์.
y_train ์ x_train ๋ฐ์ดํฐ์ ์ ๋ต์. ๋ฐ๋ผ์ ๋๊ฐ์ด 6๋ง๊ฐ๊ฐ ๋ค์ด์๋ค.
,๋ค์ ์๋ฌด๊ฒ๋ ์๋จ๋ ๊ฒ์ 1์ฐจ์ ๋ฐฐ์ด์ด๋ผ๋ ๊ฒ์ ๋ปํ๋ค.
28*28 ํํ์ ๋ฐ์ดํฐ๋ฅผ ์ธ๊ณต์ง๋ฅ ๋ชจ๋ธ์ ๋ฃ์ผ๋ ค๋ฉด 1์ฐจ์ ๋ฐฐ์ด๋ก ๋ฐ๊ฟ์ผํจ.
์ธ๊ณต ์ ๊ฒฝ๋ง์ ์ ๋ ฅ์ธต์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ ๋๋ ํ์ค๋ก ๋ง๋ค์ด์ ๋ฃ์ด์ผํ๋ค.
ํ์ฌ mnist์ ์ ๋ ฅ๊ฐ์ด 28 * 28 ์ด๋ 1* 784๋ก ๋ฐ๊ฟ์ผํ๋ค.
X_Train = x_train.reshape(60000,784) #784๊ฐ๊ฐ ํ์ค(ํ), 60000๊ฐ์ ๋ฐ์ดํฐ(์ด)
X_Test = x_test.reshape(10000,784)
X_Train = x_train.astype('float32') # ํ์
์ด intํ์ด๋ผ ์ค์ํ์ผ๋ก ๋ฐ๊ฟ. ๋ฐ์ดํฐ๊ฐ์ด 0~1 ์ฌ์ด์ ๊ฐ์ผ๋ก ์ ๊ทํํ๋ ค๋ฉด ์ค์๋ก ํํํด์ผํจ. ์ ์๋ก ํํ์๋.
X_Test = x_test.astype('float32')
X_Train /= 255 #๊ฒ์์=0, ํฐ์ =255, ํ์ =1~254 ์ด๋ 0~1์ฌ์ด๋ก ์ ๊ทํ๋ฅผ ํ๊ธฐ์ํด 255๋ก ๋๋์ด์ค.
X_Test /= 255
print(X_Train.shape)
print(X_Test.shape)
์ด์ ์ฌ๊ธฐ์ ๊ฐ ์ซ์๋ฅผ ๋ช ๋ฒ์งธ๋ผ๊ณ ์๋ ค์ฃผ๋ฉด ์ธ๊ณต์ง๋ฅ์ ๋ ๋์ ์ฑ๋ฅ์ผ๋ก ๋ถ๋ฅํ ์ ์์.
๊ทธ๋์ ์์ธก์ด ์๋ ๋ถ๋ฅ ๋ฌธ์ ์์๋ ๋ณดํต ์ ๋ต ๋ ์ด๋ธ์ ์ฒซ๋ฒ์งธ, ๋๋ฒ์งธ, ์ธ๋ฒ์จฐ ๋ฑ ์์๋ก ๋ํ๋ด๋๋ก ๋ฐ์ดํฐ์ ํํ๋ฅผ ๋ฐ๊ฟ. ์ด๊ฒ one-hot incoding์.
ํ์ ๋ํ ๋ฐ์ดํฐ๊ฐ์ด 0~1 ์ฌ์ด์ ๊ฐ์ผ๋ก ์ ๊ทํํด์ผํ๋ intํ์์ floatํ์ผ๋ก ํ๋ณํ์ ์์ผ์ค์ผํจ.
Y_train = to_categorical(y_train, 10) #์์นํ ๋ฐ์ดํฐ๋ฅผ ๋ฒ์ฃผํ ๋ฐ์ดํฐ๋ก ๋ง๋ค์ด์ฃผ๋ ์ผ๋ผ์ค ๋ด๋ถ์ ์ ํธ ๋๊ตฌ.
Y_test = to_categorical(y_test,10) # ๋ณ๊ฒฝ์ ๋ฐ์ดํฐ(y_test), ์-ํซ ์ธ์ฝ๋ฉํ ์ซ์(๋ช ๊ฐ๋ก ๊ตฌ๋ถํ ๊ฑด์ง > 10)
print(Y_train.shape)
print(Y_test.shape)
Y_train
to_categorical ํจ์๋ ์์นํ ๋ฐ์ดํฐ๋ฅผ ๋ฒ์ฃผํ ๋ฐ์ดํฐ๋ก ๋ณ๊ฒฝ์์ผ์ฃผ๋ ํจ์์.
์ฒซ๋ฒ์งธ ์ธ์๋ ๋ณ๊ฒฝ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ,
๋๋ฒ์งธ ์ธ์์๋ ์-ํซ ์ธ์ฝ๋ฉํ ์ซ์. ์ฆ, ๋ช ๊ฐ๋ก ๊ตฌ๋ถํ ๊ฒ์ธ์ง ๊ฐ์ ๋ฃ์.
์ซ์ํ๋จ ์ธ๊ณต์ง๋ฅ์ 0~9๊น์ง ์ด 10๊ฐ์ง์ ์ซ์๋ฅผ ๋ถ๋ฅํด์ผํ๋ 10์ ๋ฃ์ด์ค.
์ธ๊ณต์ง๋ฅ์ ๋ง๋ค๊ธฐ ์ํด์๋ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํ๋ ๋ฐฉํฅ์ผ๋ก ๋ณํํ๋ ๊ฒ์ด ์ค์ํ ๊ฒ์ ์ ์ ์์. ๊ทธ๋ ๊ธฐ์ ๋ฐ์ดํฐ ๋ถ์ ๋ฐ ๋ณํ์ ์ธ๊ณต์ง๋ฅ ๊ฐ๋ฐ์์ ๋งค์ฐ ์ค์ํจ.