딥러닝의 합성곱 신경망인 CNN을 Tensorflow의 mnist 데이터셋에 적용해봅시다.
CNN이란, Convolution Neural Networks의 약자로 주로 이미지와 영상 데이터를 처리할 때 사용합니다.
인간의 시신경 구조를 모방하여 자율주행자동차, 얼굴인식과 같은 객체 인식 분야에도 많이 사용합니다.
CNN을 활용한 모델은 크게 2가지로 구성되는데, 특성 추출과 분류입니다.
먼저 복잡한 이미지를 효율적으로 학습시키기 위해 이미지의 특성을 추출한 후 분류모델에 적용합니다.
특성 추출에는 Convolution filter와 Pooling layer를 사용하며, 해당 과정을 반복하면서 이미지의 크기도 적당히 줄이고 특정 feature를 강조하는 과정을 거치게 됩니다.
관련하여 좀 더 자세한 내용은 아래 블로그에 알기쉽게 정리되어 있어 참고하면 좋을 것 같습니다.
https://rubber-tree.tistory.com/116
mnist 데이터셋을 준비해봅시다.
mnist 이미지 데이터셋의 픽셀값을 정규화하기 위해 255를 나누고,
데이터셋을 CNN 모델에 적합한 형태로 변환으로 변환해야 합니다.
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train, X_test = X_train/255, X_test/255
X_train = X_train.reshape((len(X_train), 28, 28, 1))
X_test = X_test.reshape((len(X_test), 28, 28, 1))
모델 구현 시, 이미지의 특성 추출을 위해 CNN을 적용한 layer를 구성합니다.
첫번째 Conv2D는 32개의 채널에 5x5 크기의 필터를 1x1 간격으로 2차원 컨볼루션 연산을 수행합니다.
입력 크기를 유지하기 위해 padding='same'을 적용하고, 활성화 함수로 'ReLU'를 사용합니다.
그 다음 MaxPooling2D 풀링 연산을 수행합니다. 2x2 크기의 풀링을 2x2 간격으로 사용합니다.
다시한번 Conv2D와 Maxpooling 레이어를 사용한 후, Flatten으로 다차원 데이터를 1차원으로 펼칩니다.
Dense층에서는 활성화 함수로 'relu'를 적용하고, 출력층에서는 'softmax'를 적용하여 결과값을 반환합니다.
# 모델 구현
model = models.Sequential([
layers.Conv2D(32, kernel_size=(5, 5), strides=(1, 1),
padding='same', activation='relu', input_shape=(28, 28, 1)),
layers.MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
layers.Conv2D(64, kernel_size=(2, 2), padding='same', activation='relu'),
layers.MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
layers.Dropout(0.25),
layers.Flatten(),
layers.Dense(1000, activation='relu'),
layers.Dense(10, activation='softmax')
])
model.summary()
모델 훈련에 최적화 알고리즘으로 'adam'을 사용하고, loss 함수는 'sparse_categorical_crossentropy'를 사용합니다.
sparse_categorical_crossentropy는 One hot encoding이 자동으로 진행되므로 카테고리 분류에 사용하면 편리합니다.
epochs는 5로 설정하여 5번의 훈련을 진행하도록 합니다.
batch_size를 지정하지 않았기 때문에 모델이 최적의 size로 훈련을 진행하였습니다.
와.....valudation accuracy가 0.99를 넘었습니다. val_loss도 0에 가깝게 꽤 낮게 나왔습니다.
# 모델 훈련
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
hist = model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=5, verbose=1)
모델의 acc와 loss를 확인해보면 acc는 모두 1에 가깝고, loss는 0에 가깝게 나타나는 것을 확인할 수 있습니다.
import matplotlib.pyplot as plt
%matplotlib inline
plot_target = ['loss', 'val_loss', 'accuracy', 'val_accuracy']
plt.figure(figsize=(12, 8))
for each in plot_target:
plt.plot(hist.history[each], label=each)
plt.legend()
plt.grid()
plt.show()
CNN은 Convolution과 Pooling을 반복적으로 사용하면서 불변하는 특징을 찾고,
그 특징을 입력데이터로 Fully-connected 신경망에 보내 Classification을 수행하는 것이다.
'Data Tech > DataScience(데이터과학)' 카테고리의 다른 글
[머신러닝] Ridge & Lasso 회귀 모델 (feat. Bias & Variance & Regularization) (0) | 2024.07.30 |
---|---|
[딥러닝] 3. Scratch for DeepLearning (1) | 2024.05.20 |
[딥러닝] 1. MNIST 카테고리 분류 (0) | 2024.05.19 |
지도학습, 비지도학습, 강화학습의 의미와 정의 (+딥러닝?) (2) | 2024.04.09 |
[Analysis] PCA, 주성분 분석이란? (0) | 2024.04.01 |