인공지능/딥러닝

CNN(Convolutional Neural Network)-MNIST _Categorical Classification

2^7 2022. 6. 24. 14:34

CNN(Convolutional Neural Network)

합성곱(Convolutional) 신경망 알고리즘

  • 이미지 처리 작업에 주로 사용
  • 합성곱 연산을 이용하여 가중치(Weight)의 수를 줄이고 연산량을 감소
  • 여러 개의 Filter(Parameter Matrix)로 이미지의 특징(Feature Map)을 추출
  • Local connectivity & Parameter Sharing
  • 말단에 Sigmoid 또는 Softmax 함수를 적용하여 이미지 분류작업 수행
  • LeNet, AlexNet, VGGNet, InceptionNet, ResNet 등으로 발전

Hyperparameter

  • Filter
    • Filter를 Input_Data에 적용하여 특징 맵(Feature Map) 생성
    • Filer의 값은 Input_Data의 특징(Feature)을 학습하는 가중치(Weight) 행렬
    • 동일한 Filter로 Input_Data 전체에 합성곱 연산(Convolutional) 적용
    • 동일한 Filter로 Input_Data 전체에 합성곱 연산(Convolutional) 적용
  • Stride
    • Filter를 적용하기 위해 이동하는 위치의 간격
    • Stride값이 커지면 출력 특징 맵(Feature Map)의 크기가 감소
  • Pooling
    • 가로 및 세로 방향으로 크기를 줄이는 연산
    • Pooling Window 및 Stride 값 지정
  • Padding
    • Padding은 출력 크기를 조정할 목적으로 사용
    • 합성곱 연산을 수행하기 전에 Input_Data 주변을 0으로 채우는 것

Channel

  • n차원 데이터 : n차원 Filter를 사용하여 합성곱 연산 수행
  • Input_Data의 채널 수와 Filter의 채널 수는 같아야 함

Classification

  • CNN의 마지막 단계에 분류를 위한 필터를 적용(Sigmoid OR Softmax)

MNIST - Categorical Classification

1. MNIST Data_Set Load

import tensorflow
from tensorflow.keras.datasets import mnist

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


2. Data Preprocessing

2-1. Reshape and Normalization

X_train = X_train.reshape((60000, 28, 28, 1))
X_test = X_test.reshape((10000, 28, 28, 1))
X_train = X_train.astype(float) / 255
X_test = X_test.astype(float) / 255

2-2. One Hot Encoding

from tensorflow.keras.utils import to_categorical

y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

3. MNIST Keras Modeling

3-1. Model Define

#Feature Extraction Layer

from tensorflow.keras import models
from tensorflow.keras import layers

model = models.Sequential()
model.add(layers.Conv2D(filters=32, kernel_size=(3,3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPool2D(pool_size=(2,2)))
model.add(layers.Conv2D(filters=64, kernel_size=(3,3), activation='relu'))
model.add(layers.MaxPool2D(pool_size=(2,2)))
model.add(layers.Conv2D(filters=64, kernel_size=(3,3), activation='relu'))
model.summary()

model.add(layers.Flatten())
model.add(layers.Dense(units=64, activation='relu'))
model.add(layers.Dense(units=10, activation='softmax'))
model.summary()


3-2. Model Compile

model.compile(loss = 'categorical_crossentropy',
              optimizer = 'rmsprop',
              metrics = ['accuracy'])

3-3. Model Fit

%%time

Hist_mnist = model.fit(X_train, y_train,
                       epochs = 100,
                       batch_size = 128,
                       validation_split = 0.2)


3-4.학습 결과 시각화

import matplotlib.pyplot as plt

epochs = range(1, len(Hist_mnist.history['loss']) + 1)

plt.figure(figsize = (9, 6))
plt.plot(epochs, Hist_mnist.history['loss'])
plt.plot(epochs, Hist_mnist.history['val_loss'])
# plt.ylim(0, 0.4)
plt.title('Training & Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(['Training Loss', 'Validation Loss'])
plt.grid()
plt.show()


3-5. Model Evaluate

loss, accuracy = model.evaluate(X_test, y_test)

print('Loss = {:.5f}'.format(loss))
print('Accuracy = {:.5f}'.format(accuracy))

728x90