Colab으로 하루에 하나씩 딥러닝

합성곱 신경망_2.fashion_mnist 실습 본문

딥러닝_개념

합성곱 신경망_2.fashion_mnist 실습

Elleik 2022. 12. 28. 23:30
728x90

합성곱 신경망 맛보기

### 라이브러리 호출

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
### fashion_mnist 데이터셋 내려받기

fashion_mnist = tf.keras.datasets.fashion_mnist
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()

fashion_mnist 데이터셋 내려받기

### 분류에 사용될 클래스 정의

class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress', 'Coat',
               'Sandal','Shirt','Sneaker','Bag','Ankle Boot']

for i in range(25):
  plt.subplot(5, 5, i+1)
  plt.grid(False)
  plt.xticks([])
  plt.yticks([])
  plt.imshow(x_train[i], cmap=plt.cm.binary)
plt.show()  # 이미지 데이터 25개를 시각적으로 표현

이미지 데이터 25개 시각적 표현

### 심층 신경망을 이용한 모델 생성 및 훈련

X_train, x_test = x_train / 255.0, x_test / 255.0 
model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28,28)),	# 설명 1
    tf.keras.layers.Dense(128, activation='relu'),	# 설명 2
    tf.keras.layers.Dropout(0.2),					# 설명 3
    tf.keras.layers.Dense(10, activation='softmax')	# 설명 4
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])					# 설명 5

model.fit(x_train, y_train, epochs=5) # 훈련 데이터셋을 이용하여 모델 훈련
model.evaluate(x_test, y_test, verbose=2) # 검증 데이터셋을 이용하여 모델 평가

epoch 5로 모델 훈련 결과

상세 설명

  • 설명 1: 해당 데이터를 완전연결층에 전달할 때 1차원으로 바꿔주는 Flatten을 사용함
  • 설명 2: 합성곱층에서 특성 맵을 만들고, 풀링층에서 차원을 감소시킴. 감소된 특성 맵은 밀집층의 입력으로 사용되고 그 결과가 출력층과 연결됨. 입력층과 출력층을 연결하기 위해 밀집층을 사용함
  • 설명 3: 과적합을 방지하기 위해 특정 노드를 0으로 만듦. 해당 코드에서는 20%의 노드를 무작위로 0으로 만들어줌
  • 설명 4: 출력층의 노드 개수는 10개이고, 소프트맥스를 활성화 함수로 사용함
  • 설명 5: 
    • optimizer: 손실 함수를 사하여 구한 값으로 기울기를 구하고 네트워크의 파라미터를 학습에 어떻게 반영할지 결정함
    • loss: 최적화 과정에서 사용될 손실 함수를 설정
    • metrics: 모델의 평가 기준
### 데이터 전처리

X_train_final = x_train.reshape((-1,28,28,1)) / 255.0
X_test_final = x_test.reshape((-1,28,28,1)) / 255.0
### 합성곱 네트워크를 이용한 모델 생성

model_with_conv = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, (3,3), padding='same', activation='relu', 
    input_shape=(28,28,1)),	# 설명 1
    tf.keras.layers.MaxPooling2D((2,2), strides=2),	
    tf.keras.layers.Conv2D(64, (3,3), padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D((2,2), strides=2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')	
])

model_with_conv.compile(optimizer='adam',
                        loss='sparse_categorical_crossentropy',
                        metrics=['accuracy'])

상세 설명

  • 설명 1: 
    • 32: 합성곱 필터 개수
    • (3,3): 합성곱 커널의 행과 열
    • padding: 경계 처리 방법
      • valid: 유요한 영역만 출력되므로 출력 이미지 크기가 입력 이미지 크기 보다 작음
      • same: 출력 이미지 크기와 입력 이미지 크기가 동일
    • activation: 활성화 함수 설정
      • linear: 기본값으로 결괏값이 그대로 출력됨
      • relu: 은닉층에서 주로 사용됨
      • sigmoid: 이진 분류 문제에서 출력층에서 주로 사용됨
      • tanh: 함수 중심 값을 0으로 옮겨 시그모이드의 최적화 과정이 느려지는 문제를 개선
      • softmax: 다중 분류 문제에서 출력층에 자주 쓰임
    • input_shape: 입력 데이터의 형태를 정의
### 모델 훈련 및 성능 평가

model_with_conv.fit(X_train_final, y_train, epochs=5)
model_with_conv.evaluate(X_test_final, y_test, verbose=2)

해당 모델은 정확도가 94%가 나옴

참고: 서지영, 『딥러닝 텐서플로 교과서』, 길벗(2022)