데이터 분석가
article thumbnail
Published 2023. 8. 29. 17:47
CNN_MNIST DeepLearning
  • 이번 글에서는 컴퓨터 비전 관련 작업에 쓰이는 CNN(=합성곱신경망, 컨브넷) 딥러닝 모델을 MNIST 이미지 분류 문제에 적용하는 간단한 예제를 다뤄보겠습니다.

교재 홍보

 

케라스 창시자에게 배우는 딥러닝 개정 2판 - 예스24

단어 하나, 코드 한 줄 버릴 것이 없다!단 한 권의 딥러닝 책을 선택한다면 바로 이 책이다!케라스 창시자이자 구글 딥러닝 연구원인 저자는 ‘인공 지능의 민주화’를 강조한다. 이 책 역시 많

www.yes24.com

모델 생성

  • Conv2D와 MaxPooling2D 층을 쌓아 올려 기본적인 컨브넷을 만들어 보겠습니다.
from tensorflow import keras
from tensorflow.keras import layers
# 입력층, 순서대로 image_height, image_width, image_channels를 의미
inputs = keras.Input(shape=(28, 28, 1)) 
    # MINST의 이미지 포맷을 고려하여 shape = (28, 28, 1), 순서대로 image_height, image_width, image_channels를 의미
# 합성곱 층, filters=32 깊이
x = layers.Conv2D(filters=32, kernel_size=3, activation="relu")(inputs) # 함수형 API
x = layers.MaxPooling2D(pool_size=2)(x)
x = layers.Conv2D(filters=64, kernel_size=3, activation="relu")(x)
x = layers.MaxPooling2D(pool_size=2)(x)
x = layers.Conv2D(filters=128, kernel_size=3, activation="relu")(x)

# 출력층
x = layers.Flatten()(x)
outputs = layers.Dense(10, activation="softmax")(x) # 3개 이상 분류는 softmax

# 모델 생성
model = keras.Model(inputs=inputs, outputs=outputs)
  • 모델의 구조를 파악합니다.
  • 결과를 살펴보면 Conv2D와 MaxPooling2D의 출력은 height, width, channels크기의 랭크-3 텐서임을 볼 수 있고, 높이와 너비는 모델이 깊어질수록 작아지며, 채널의 수는 커지는 경향이 있다.
  • 마지막 Conv2D층의 출력인 (3, 3, 128)을 Dense층을 쌓아 만든 밀집 연결 분류기로 주입해야 한다. 이때, 이 분류기는 1D벡터를 처리하므로 flatten층으로 3D 출력을 1D 텐서로 펼쳐준다. MNIST이미지는 10개의 클래스를 분류하는 것이 목표이므로 마지막 층의 출력 크기는 10으로 한다.
model.summary()

모델 훈련

  • 이미지를 불러와 전처리해주고, 이를 이용해 컨브넷을 훈련한다.
from tensorflow.keras.datasets import mnist

# 데이터 불러오기
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

# 데이터 전처리
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype("float32") / 255
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype("float32") / 255

# 모델 컴파일
model.compile(optimizer="rmsprop",
    loss="sparse_categorical_crossentropy", 입력 데이터가 정수텐서로 원-핫 인코딩을 요하므로 설정
    metrics=["accuracy"])

# 모델 훈련
model.fit(train_images, train_labels, epochs=5, batch_size=64)

모델 평가

  • 테스트 데이터를 이용해 컨브넷의 정확도를 평가한다.
  • 대략 0.99의 정확도를 보여 이전의 블로그 글에서 완전 연결 네트워크로 분류했을 때의 0.98보다 더 높은 정확도를 얻음을 볼 수 있다.
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('테스트 정확도 : ', test_acc)

최대 풀링 연산

  • 완전 연결 네트워크보다 컨브넷 모델이 더 높은 정확도를 보이는 이유를 알아보겠습니다.
  • 모델 요약에서 특성 맵의 크기가 최대 풀링 연산층을 거칠 때 26*26에서 13*13으로 절반으로 줄어든 것을 볼 수 있는데, 이처럼 특성 맵을 강제적으로 다운샘플링 하는 것이 최대 풀링의 역할입니다.
  • 이처럼 다운샘플링을 하는 이유는 처리할 특성 맵의 가중치 파라미터를 줄여 모델의 가동시간을 줄이고 과대적합을 방지하기 위해서입니다.

'DeepLearning' 카테고리의 다른 글

CNN_데이터 증식  (0) 2023.08.30
CNN_강아지 vs 고양이  (0) 2023.08.30
다중 분류 모델_Reuter  (0) 2023.08.29
이진 분류 모델_IMDB데이터  (0) 2023.08.28
tensorflow를 통한 선형 분류기 구현  (0) 2023.08.25
profile

데이터 분석가

@이꾹꾹

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!