########## (9μͺ½) ν¨ν€μ§ μν¬νΈ ##########
import numpy as np
########## (10μͺ½) ννν, μ κ·ν ##########
### ------ mnist λ°μ΄ν° λ€μ΄λ‘λ ν¨μ load_mnist()μ μ
def load_mnist(flatten=True, normalize = False) :
### ------ mnist λͺ¨λ μν¬νΈ
from tensorflow.keras.datasets import mnist
### ------ λ΄λ €λ°μ λ°μ΄ν°λ₯Ό νλ ¨μ©, ν
μ€νΈμ©μΌλ‘ λΆλ¦¬
(x_train, t_train), (x_test, t_test) = mnist.load_data()
### ------ μ κ·ν κ³Όμ
if normalize :
### ------ κ° κ°μ 255λ‘ λλμ΄ 0κ³Ό 1 μ¬μ΄ κ°μΌλ‘ λ§λ¦.
x_train, x_test = x_train / 255.0, x_test / 255.0
### ----- κ° μ«μλ₯Ό λΆλμμμ μΌλ‘ νκΈ°
x_train = x_train.astype(np.float32)
x_test = x_test.astype(np.float32)
### ------ ννν κ³Όμ
if flatten :
### ------ ννν μ΄μ x_train, x_testμ νν μΆλ ₯
print("<ννν μ΄μ λ°μ΄ν° κ°μμ νν>")
print('ννν μ΄μ x_train νν ::', 'κ°μ:', x_train.shape[0], 'μ¬μ΄μ¦:', x_train.shape[1:])
print("ννν μ΄μ x_test νν::", 'κ°μ:', x_test.shape[0], 'μ¬μ΄μ¦:', x_test.shape[1:])
### ------ ννν(μ΄λ―Έμ§κ°μλ κ·Έλλ‘ λκ³ ν μ€λ‘ λ°κΏ.)
x_train = x_train.reshape(x_train.shape[0], -1)
x_test = x_test.reshape(x_test.shape[0], -1)
### ------ ννν μ΄ν x_train, x_test νν μΆλ ₯
print('')
print('<ννν μ΄ν λ°μ΄ν° κ°μμ νν>')
print('ννν μ΄ν x_train νν::', 'κ°μ:', x_train.shape[0], 'μ¬μ΄μ¦:', x_train.shape[1:])
print("ννν μ΄ν x_test νν::", 'κ°μ:', x_test.shape[0], 'μ¬μ΄μ¦:', x_test.shape[1:])
return (x_train, t_train), (x_test, t_test)
### ------ load ν¨μλ₯Ό νΈμΆνκ³ λ³μμ ν
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize = False)
########## (11μͺ½) νλ ¨μ© λ°μ΄ν°μ
μ 첫λ²μ§Έ λ°μ΄ν°λ₯Ό μ΄λ―Έμ§νλ ¬λ‘ λνλ΄κΈ° ##########
for i, x in enumerate(x_train[0]) :
### ---- xλ₯Ό 3μ리 μ μλ‘ νννκ³ κ³΅λ°± μ½μ
print(f'{x:3}', end=' ')
### ---- 28λ²μ§Έ μ«μλ§λ€ μ€λ°κΏ.
if (i+1)%28 == 0 :
print()
########## (12μͺ½) μΈκ³΅μ§λ₯ λͺ¨λΈ μμ± ##########
### ------ ν¨ν€μ§ μν¬νΈ
import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import mnist
import matplotlib.pyplot as plt ### μκ°ν λꡬ
### --- load_mnist() ν¨μλ‘ λ°μ΄ν°λ₯Ό λ΄λ €λ°μ νλ ¨μ©, ν
μ€νΈμ© λ³μμ ν λΉ(μ κ·ν, ννν λͺ¨λ μν)
(train_images,train_labels),(test_images,test_labels) = load_mnist(flatten=True, normalize=True)
########## (13μͺ½) λͺ¨λΈ μμ± : λ€μΈ΅ νΌμ
νΈλ‘ (MLP) μμ± ##########
model = models.Sequential([
### --- μλμΈ΅1 κ΅¬μ± (λ΄λ°κ°μ : 128, νμ±νν¨μ : relu)
layers.Dense(128, activation = 'relu'),
### --- μλμΈ΅2 κ΅¬μ± (λͺ°λΌλ λ¨.)
layers.Dropout(0.2),
### --- μΆλ ₯μΈ΅ κ΅¬μ± (λ΄λ°κ°μ: 10κ° (μ«μ0~9), νμ±νν¨μ : softmax)
### --- μλμΈ΅μ κ±°μ³ κ³μ°λ (μ΄λ―Έμ§μ μ μ kκ° μ μ¬ μ λ)λ₯Ό μΆλ ₯μΈ΅μ κ° νΌμ
νΈλ‘ 0~9λ‘ μΆλ ₯
layers.Dense(10, activation='softmax')
])
### --- λͺ¨λΈ μ»΄νμΌ(μμ€ν¨μ, μ΅ν°λ§μ΄μ , νκ°μ§ν μ€μ - μμ§ λͺ°λΌλ λ¨)
model.compile(optimizer = 'adam',
loss = 'sparse_categorical_crossentropy',
metrics = ['accuracy'])
########## (14μͺ½) λͺ¨λΈ νλ ¨(κ°μ€μΉμ€μ ) : νλ ¨μ© λ°μ΄ν°λ₯Ό μ¬μ©νμ¬ λͺ¨λΈ νμ΅μν€κΈ° ##########
model.fit(train_images, train_labels, epochs=5)
### ------ λͺ¨λΈ νκ° : ν
μ€νΈ λ°μ΄ν°λ‘ λͺ¨λΈ μ±λ₯ ν
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose = 2)
print(f'\nTest Accuracy : {test_acc * 100:.2f} %')
########## (15μͺ½) μμΈ‘ λ° μκ°ν ##########
### ------ ν
μ€νΈ μ΄λ―Έμ§μμ μμΈ‘κ° μ»κΈ°
predictions = model.predict(test_images)
predicted_labels = [tf.argmax(p) for p in predictions]
### ------ μμΈ‘ λ° μκ°ν
plt.figure(figsize=(9,9)) # μλ‘μ΄ κ·Έλ¦Ό μμ± λ° μ¬μ΄μ¦λ₯Ό 9*9λ‘ μ€μ
for i in range(25) : # test_imagesμ 첫 25κ° κ·Έλ¦Όμ λν΄ μν
plt.subplot(5,5,i+1)
plt.xticks([]) # xμΆ λκΈ λΉνμ±ν
plt.yticks([]) # yμΆ λκΈ λΉνμ±ν
plt.grid(False) # 그리λ λΉνμ±ν
plt.imshow(test_images[i].reshape(28,28), cmap = plt.cm.binary) # μ΄λ―Έμ§ 리μ€νΈλ₯Ό μ΄μ§μμ κ·Έλ¦ΌμΌλ‘ νμ
plt.xlabel(f"real : {test_labels[i]} - predict : {predicted_labels[i]}") # μ€μ κ°, μμΈ‘κ° νμ
plt.show() # νλ©΄μ λνλ΄κΈ°