# Day_22_01_LeNet5.py
import tensorflow as tf
import numpy as np
# LeNet5 모델을 구현해서, 최초 만들었던 cnn 모델과 정확도를 비교하세요
# summary 함수에서 출력한 total params 항목이 61,706으로 되어있는데 왜 그렇게 되는지 직접 계산해보세요
def LeNet5():
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train = x_train / 255
x_test = x_test / 255
# 4차원으로 변환
x_train = x_train.reshape(-1, 28, 28, 1)
x_test = x_test.reshape(-1, 28, 28, 1)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Input(shape=[28, 28, 1]))
# kernel_size=3 <- 똑같은 숫자면 이렇게 가능
# (None, 28, 28, 6) -> 5 * 5 * 6(w) + 6(바이어스) = 156
model.add(tf.keras.layers.Conv2D(filters=6, kernel_size=[5, 5],
strides=[1, 1], padding='same', activation='relu')) # 앞의 4개 이름 생략가능
# (None, 14, 14, 6)
model.add(tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=[2, 2], padding='same')) # 전부다 순서대로쓰면 생략가능
# (None, 10, 10, 16) 5 * 5 * 6(앞의 필터의 개수) * 16(w) + 16(바이어스)
model.add(tf.keras.layers.Conv2D(16, [5, 5], [1, 1], 'valid', activation='relu')) # 이런식으로
# (None, 5, 5, 16)
model.add(tf.keras.layers.MaxPool2D([2, 2], [2, 2], 'same')) # 생략가능
# (None, 400)
model.add(tf.keras.layers.Flatten())
# 400 * 120 + 120(바이어스) = 48120
model.add(tf.keras.layers.Dense(120, activation='relu'))
# 120 * 84 + 84(바이어스) = 10164
model.add(tf.keras.layers.Dense(84, activation='relu'))
# 84 * 10 +10 = 840 + 10(바이어스) = 850
model.add(tf.keras.layers.Dense(10, activation='softmax'))
model.summary()
model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.001),
loss=tf.keras.losses.sparse_categorical_crossentropy,
metrics=['acc'])
model.fit(x_train, y_train, epochs=1, batch_size=100, verbose=2)
print('acc : ', model.evaluate(x_test, y_test, verbose=0))
# ------------------------------------------------ #