인공지능/CNN

LeNet5

쿠와와 2020. 12. 4. 17:47
# 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))
    
    # ------------------------------------------------ #