인공지능 - 컨볼루션 신경망을 이용한 MNIST 분류 실습
2022. 11. 29. 22:11ㆍ인공지능
컨볼루션 신경망(CNN, Convolutional Neural Network)은 딥러닝 알고리즘 중 하나이다.
인간의 시각 시스템의 수용체 구조와 유사하게 지역 정보를 활용하여 특징을 찾아내서 전체 정보를 인식한다는 특성을 가진다.
컨볼루션은 영상처리에서 나온 용어로 미리 정의된 필터를 영상에 적용하여 적절한 특징을 뽑아내는 과정이다.
CNN에서의 컨볼루션도 동일한 의미를 가진다. 컨볼루션이 적용된 결과를 특징맵(feature map)이라고 한다.
CNN은 컨볼루션 레이어와 Max Pooling 레이어를 반복적으로 적용하여 특징을 추출한다.
이번 포스트에서는 Mnist 이미지 데이터를 불러와서 CNN모델에 학습을 시키고 테스트를 진행하여 결과를 출력해보는 실습을 진행해보았다.
모델 구성 정보
활성화 함수 - Relu 함수
최적화 함수 - Nadam 함수(학습률 : 0.01)
출력층 활성화 함수 - 소프트맥스
배치사이즈(미니배치) - 64개
validation_split - 0.2
epoch 수 - 5회
패딩 - x
Feature map - max 값 풀링
Stride - 1 (default = 1)
모델 구조
입력층 | 28 * 28 |
Convolution1 | 3 * 3 * 32 |
Max pooling | |
Convolution2 | 3 * 3 * 64 |
Max pooling | |
Convolution3 | 3 * 3 * 64 |
Flatten | |
Fully Connected | 64 |
Fully Connected | 10 |
전체 순서
1. MNIST에서 이미지 데이터를 로드
2. 학습, 테스트 데이터를 0~1 사이로 정규화
3. 모델 구성
4. 학습 진행
5. 학습 진행과정 출력
6. 모델 평가
7. 평가 결과 출력
전체 코드 |
from IPython.testing import test
import tensorflow as tf
import matplotlib.pylab as plt
import numpy as np
from keras.utils import to_categorical
from keras.models import Sequential
from keras.layers import Dense, Conv2D, MaxPooling2D
# MNIST 데이터를 Load
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
# CNN 입력:학습을 진행할 데이터의 정보(배치크기, 영상높이, 영상너비, 채널수)를 입력
train_images = train_images.reshape((60000, 28, 28, 1)) # 28 * 28 크기의 이미지 1층 60,000 장 - 학습 데이터
test_images = test_images.reshape((10000, 28, 28, 1)) # 28 * 28 크기의 이미지 1층 10,000 장 - 테스트 데이터
train_images, test_images = train_images / 255.0, test_images / 255.0 # 이미지의 0~255까지의 밝기 데이터를 0~1사이의 값으로 정규화
one_hot_train_labels = to_categorical(train_labels, 10) # one hot encoding
one_hot_test_labels = to_categorical(test_labels, 10) # one hot encoding
print(one_hot_train_labels[:10]) # one hot encoding 결과 확인
# 모델 구성 정보
# 활성화 함수 : relu 함수
# 최적화 함수 : Nadam 함수 / 학습률 : 0.01
# 출력층 활성화 함수 : 소프트맥스
# 배치사이즈(미니배치) : 64개
# validation_split : 0.2
# epoch 수 : 5회
# 패딩 : x
# Feature map : max 값 풀링
# Stride : 1 (default = 1)
model = Sequential()
model.add(Conv2D(32, (3, 3), activation = 'relu', strides = (1, 1), input_shape = (28, 28, 1))) # 3*3 필터 사용 -> 32장의 Feature map 생성
# 결과 : (26 * 26)크기의 특징 맵 * 32
model.add(MaxPooling2D((2, 2)))
# 결과 : (13 * 13)크기의 특징 맵 * 32
model.add(Conv2D(64, (3, 3), activation = 'relu'))
# 결과 : (11 * 11)크기의 특징 맵 * 64장
model.add(MaxPooling2D((2, 2)))
# 결과 : (5 * 5)크기의 특징 맵 * 64
model.add(Conv2D(64, (3, 3), activation = 'relu'))
# 결과 : (3 * 3)크기의 특징 맵 * 64
model.add(tf.keras.layers.Flatten()) # 특징맵을 벡터로 펼쳐주는 작업
model.add(Dense(64, activation = 'relu')) #
model.add(Dense(10, activation = 'softmax'))
model.compile(optimizer=tf.optimizers.Nadam(learning_rate = 0.01), loss = 'categorical_crossentropy', metrics = ['accuracy'])
model.summary() # 모델 구조 출력
history = model.fit(train_images, one_hot_train_labels, epochs = 5, batch_size = 64, validation_split = 0.2) # 학습 진행
plt.figure(figsize = (12, 4)) # 그래프의 가로, 세로 비율
plt.subplot(1, 1, 1) # 1행 1열의 첫 번째 위치
plt.plot(history.history['loss'], 'b--', label = 'loss') # loss는 파란색 점선
plt.plot(history.history['accuracy'], 'g-', label = 'Accuracy') # accuracy는 녹색 실선
plt.xlabel('Epoch')
plt.legend()
plt.show()
print('학습 완료!')
# 테스트 데이터를 통해 학습된 모델 확인
print("\n==============test results==============")
labels = model.predict(test_images)
print("\n Accuracy: %.4f" % (model.evaluate(test_images,one_hot_test_labels)[1]))
# 테스트 예시 출력
fig = plt.figure()
for i in range(15):
subplot = fig.add_subplot(3, 5, i + 1)
subplot.set_xticks([])
subplot.set_yticks([])
subplot.set_title('%d' % np.argmax(labels[i]))
subplot.imshow(test_images[i].reshape((28, 28)), cmap = plt.cm.gray_r)
plt.show()
print("===================================")
|
실행 결과 |
![]() ![]() ![]() ![]() |
추후 Drop Out과 Batch Normalization에 관해서도 추가로 포스팅 할 예정입니다.
'인공지능' 카테고리의 다른 글
인공지능 - RNN(Recurrent Neural Network) (0) | 2022.12.05 |
---|---|
인공지능 - 과적합, 과소적합 (0) | 2022.11.30 |
인공지능 - 정규화 방법(Batch Normalization) (0) | 2022.11.29 |
인공지능 - 정규화 방법(Dropout) (0) | 2022.11.29 |
인공지능 - 활성화 함수 (0) | 2022.11.15 |