CNN (딥러닝)

TaeHyun Lee·2023년 5월 15일
0

AI 공부

목록 보기
17/17

이미지 종류

이미지 종류에는 일반적으로 두 가지가 있습니다.

  • True color 이미지 : 빨강, 초록, 파랑(RGB)을 조합하여 모든 색상을 표현하는 이미지입니다. 이러한 이미지는 각각의 픽셀이 세 가지 색상 채널의 강도를 가지고 있으며, 이를 결합하여 이미지가 표현됩니다. 대부분의 디지털 이미지는 true color 이미지입니다.

  • Grey scale 이미지 : 흑백 이미지라고도 하며, 색상 대신 밝기를 사용하여 이미지를 표현합니다. 각각의 픽셀은 0에서 255까지의 값으로 표시되며, 0은 검은색, 255는 흰색을 나타냅니다. 중간 값은 회색으로 표현됩니다.

CNN을 사용하는 이유

CNN(Convolutional Neural Network)은 이미지, 비디오, 음성 등의 복잡한 데이터를 처리하는 데 있어서 매우 효과적인 딥러닝 모델입니다. CNN을 사용하는 이유는 다음과 같습니다.

  • 지역적인 정보 추출
  • 가중치 공유
  • 데이터의 효율적인 처리
  • 전이 학습(Transfer Learning)

CNN에서 convolution layer 동작원리

  • 입력 이미지 : Convolution layer의 입력은 이미지 텐서입니다. 이미지 텐서는 높이, 너비 및 채널 수로 구성된 3D 배열입니다.

  • 필터(커널) : Convolution layer는 필터 또는 커널이라는 작은 크기의 가중치 행렬을 사용합니다. 이 필터는 입력 이미지에 적용됩니다.

  • Convolution 연산 : 필터는 입력 이미지 위를 이동하며, 각 위치에서 필터와 입력 이미지의 교차점을 곱한 값들을 모두 더하여 특징 맵을 생성합니다. 이 과정을 stride 값만큼 이동하면서 모든 위치에서 반복합니다. 이는 입력 이미지에 대한 필터의 윈도우를 슬라이딩 윈도우로 적용하는 것과 유사합니다.

  • Activation Function : Convolution layer는 특징 맵에 비선형성을 추가하기 위해 활성화 함수를 적용합니다. 대표적인 예로는 ReLU(Rectified Linear Unit) 함수가 있습니다.

  • Pooling : Convolution layer에서 생성된 특징 맵은 pooling layer를 통해 다운 샘플링됩니다. Max pooling이 가장 많이 사용되며, 각 윈도우에서 가장 큰 값을 선택하여 특징 맵을 다운 샘플링합니다.

  • 반복 : 위의 과정을 여러 번 반복하여 다양한 필터를 적용하고, 다운 샘플링하여 최종적으로 이미지에서 특징을 추출합니다.

Pooling layer 동작원리

  • 입력 이미지 : Pooling layer의 입력은 Convolutional layer에서 생성된 특징 맵(feature map)입니다.

  • Pooling 윈도우 : Pooling layer는 입력 특징 맵에서 작은 크기의 윈도우를 이동시키며, 각 윈도우에서 대표값을 추출합니다. 윈도우는 일반적으로 2x2 또는 3x3 크기입니다.

  • 대표값 선택 : Max pooling의 경우 각 윈도우에서 가장 큰 값을 선택하고, Average pooling의 경우 각 윈도우에서 값의 평균을 선택합니다.

  • 출력 특징 맵 : 대표값을 추출한 후, pooling layer는 이를 출력 특징 맵으로 반환합니다. 이 출력 특징 맵은 입력 특징 맵의 크기를 줄이고, 계산 비용을 줄이면서도 중요한 특징을 유지할 수 있습니다.

Flatten이란?

Flatten은 다차원 배열을 1차원 배열로 변환하는 작업으로, 딥러닝 모델에서 주로 입력 데이터를 1차원 배열로 만들 때 사용됩니다. 이를 통해 Fully Connected Layer와 같은 다음 레이어에서 입력을 처리할 수 있도록 하며, 모델의 계산 비용과 메모리 사용량을 줄일 수 있습니다.

예제 코드

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical

import matplotlib.pyplot as plt
import numpy as np

# 데이터를 불러옵니다.
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype('float32') / 255
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

# 컨볼루션 신경망의 설정
model = Sequential()
model.add(Conv2D(32, kernel_size=(3,3), input_shape=(28,28,1), activation='relu'))
model.add(Conv2D(64, (3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))

# 모델의 실행 옵션을 설정합니다.
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# 모델 최적화를 위한 설정 구간입니다.
modelpath = "./MNIST_CNN.hdf5"
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=1, save_best_only=True)
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=10)

# 모델을 실행합니다.
history = model.fit(X_train, y_train, validation_split=0.25, epochs=30, batch_size=200, verbose=0, callbacks=[early_stopping_callback, checkpointer])

# 테스트 정확도를 출력합니다.
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, y_test)[1]))

# 검증셋과 학습셋의 오차를 저장합니다.
y_vloss = history.history['val_loss']
y_loss = history.history['loss']

# 그래프로 표현해 봅니다.
x_len = np.arange(len(y_loss))
plt.plot(x_len, y_vloss, marker='.', c="red", label='Testset_loss')
plt.plot(x_len, y_loss, marker='.', c="blue", label='Trainset_loss')

# 그래프에 그리드를 주고 레이블을 표시하겠습니다.
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()![](https://velog.velcdn.com/images/taehi/post/e7f05665-73e3-48d8-ba96-a2ffb3f60802/image.png)
profile
서커스형 개발자

0개의 댓글