Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

LeNet

1998년 최초의 합성곱 신경망

초기의 성공적인 합성곱 신경망은 1998년에 발표된 LeNet입니다. LeNet은 합성곱 계층을 사용한 7층의 신경망으로, 손글씨를 인식하는 모델로 활용되었습니다. 1989년 합성곱 신경망이 최초로 고안된 이후 십년 정도의 기간 동안 다듬어져 완성된 결과물입니다.

1998년에는 여러 모델을 비교하기 위한 표준 데이터 집합을 도입하여, 합성곱 신경망과 다른 모델을 같은 기준으로 비교하였습니다. 이 비교에서 합성곱 신경망은 손글씨를 인식하는 다른 모델을 압도하는 성과를 보이며 주목받았고, 손글씨 인식이 필요한 우편 서비스 등에 실제로 활용되었습니다. 당시 미국 우편 서비스의 평가에 따르면 인식 오류가 1% 정도로, 매우 탁월한 성능을 보여주었습니다.

현재 이미지 인식에 활용되는 딥러닝 모델은 대부분 합성곱 신경망을 기반으로 한다고 할 수 있습니다. 1998년의 LeNet은 2012년 AlexNet이 같은 기술을 빅데이터에 적용하면서 그 가치를 재평가받았습니다. 딥러닝의 불씨가 점화되는 데 합성곱 신경망이 큰 역할을 한 것입니다.

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

print(f'TensorFlow {tf.__version__}')
from tensorflow.keras.datasets import mnist

(X_train, y_train), (X_test, y_test) = mnist.load_data()

def 전처리(X, to_shape):
    X = X.astype('float32')
    X = X.reshape(-1, *to_shape)
    X /= 255
    return X
model = keras.Sequential(
    [
        keras.Input(shape=(28, 28, 1)),
        layers.Conv2D(6, kernel_size=(5, 5), padding='same', activation="sigmoid"),
        layers.MaxPooling2D(pool_size=(2, 2)),
        layers.Conv2D(16, kernel_size=(5, 5), activation="sigmoid"),
        layers.MaxPooling2D(pool_size=(2, 2)),
        layers.Flatten(),
        layers.Dense(120, activation="sigmoid"),
        layers.Dense(84, activation="sigmoid"),
        layers.Dense(10, activation="softmax"),
    ]
)

model.summary()
keras.utils.plot_model(model, "mnist_lenet5.png", show_shapes=True)
from keras.losses import sparse_categorical_crossentropy
model.compile(loss=sparse_categorical_crossentropy, optimizer="adam", metrics=["accuracy"])
history = model.fit(전처리(X_train, to_shape=(28, 28, 1)), y_train, batch_size=128, epochs=30, validation_split=0.1)
loss, acc = model.evaluate(X_test, y_test)
print(f'loss={loss:.2f}, acc.={acc:.2%}')