CNN(합성곱 신경망)이란?

  • 합성곱 신경망에서는 뉴런을 필터 혹은 커널이라고 부른다.
  • 위의 그림처럼 (4,4) 크기의 입력을 (3,3) 커널을 이용하여 (2,2)크기로 합성곱 계산을 통해 얻은 출력을 특성 맵이라고 부른다. 이때 (3,3)인 커널을 3종류 사용하면 위의 그림과 같이 (2,2,3) 크기의 3차원 배열이 된다.

케라스 합성곱 층

  • 왼쪽에서 오른쪽, 위에서 아래로 이동하는 합성곱은 Conv2D 클래스로 제공한다.
from tensorflow import keras
keras.layers.Conv2D(10, kernel_size=(3,3),activation='relu')

-> 첫 번째 매개변수는 커널의 개수이고, 두 번째 매개변수는 사용할 커널의 사이즈이다.

패딩

  • 위의 그림처럼 (4,4) 입력에 (3,3) 커널을 사용하면 출력이 (2,2)로 줄어들게 된다. 이때 출력을 (4,4)로 유지하고 싶다면 입력 배열의 주위를 아래와 같이 가상의 원소로 채워주는 세임 패딩을 해주면 된다. (보통 패딩은 0으로 채워준다.) 패딩 없이 순수한 입력 배열에서만 합성곱을 하여 특성 맵을 만드는 경우를 밸리드 패딩이라고 부른다.

    -> 밸리드 패딩으로 합성곱을 하면 모서리에 있는 정보는 희미하게, 가운데 있는 정보는 두드러지게 표현될 수 있다. 따라서 적절한 패딩을 이미지 주변에 있는 정보를 잃어버리지 않도록 도와준다.
keras.layers.Conv2D(10, kernel_size=(3,3), activation='relu', padding='same', strides=1)

-> 마지막 매개변수인 strides(스트라이드)는 이동의 크기로 기본값이 1이며, 보통 기본값 그대로 사용한다.

풀링

  • 풀링은 합성곱 층에서 만든 특성 맵의 가로세로 크기를 줄이는 역할을 한다.(단, 특성 맵의 개수를 줄이지는 않는다.)

-> 풀링에는 가중치가 없다. 도장을 찍은 영역에서 가장 큰 값을 고르면 최대 풀링, 평균값을 계산하면 평균 풀링이라고 부른다. 풀링에서는 겹치지 않게 이동하기 때문에 풀링 크기가 (2,2)라면 스트라이드가 2, (3,3)이라면 스트라이드가 3이다.

  • 풀링 클래스 종류에는 AveragePooling2D(평균 풀링), MaxPooling2D(최대 풀링)이 있다. 이때 평균 풀링은 특성 맵에 있는 중요한 정보를 평균화하는 과정에서 정보가 희석될 수 있기 때문에 대부분은 최대 풀링을 사용한다.

CNN(합성곱 신경망)의 전체 구조

  • 만약 RGB(빨강, 초록, 파랑)으로 구성된 컬러 이미지를 사용한다면 깊이가 3인 커널을 활용하면 된다. 예를 들어 (4,4,3) 입력을 (3,3,3) 커널을 이용한다면 (2,2) 크기의 특성 맵이 만들어진다. 즉, 입력이나 필터의 차원이 몇 개인지 상관없이 항상 출력은 하나의 값이다.

  • fashion MNIST 데이터셋을 이용하여 저번과 같이 학습 데이터와 검증 데이터를 나누어준 뒤, 합성곱 신경망을 만든다면 아래와 같다.

model = keras.Sequential()
# 32개의 (3,3) 커널을 이용하여 세임 패딩을 해준다.
model.add(keras.layers.Conv2D(32, kernel_size=3, activation='relu', padding='same', input_shape=(28, 28, 1)))
#(2,2) 크기의 최대 풀링을 한다.
model.add(keras.layers.MaxPooling2D(2))
# 64개의 (3,3) 커널을 이용하여 세임 패딩을 해준다.
model.add(keras.layers.Conv2D(64, kernel_size=3, activation='relu', padding='same'))
# (2,2) 크기의 최대 풀링을 한다.
model.add(keras.layers.MaxPooling2D(2))
# 특성 맵을 일렬로 펼쳐서 신경망을 통과시킨다.
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dropout(0.4))
model.add(keras.layers.Dense(10, activation='softmax'))
  • [keras.utils.plot_model(model, show_shapes=True)]를 사용하면 각 층마다의 입력층과 출력층을 확인할 수 있다.

  • 이후 저번과 동일하게 모델 컴파일과 훈련을 한 후, evaluate()로 테스트 세트에 대한 성능을 측정하면 약 91%로 더 높은 성능을 보이고 있는 것을 확인 할 수 있다.
profile
💻🐜💡

0개의 댓글

Powered by GraphCDN, the GraphQL CDN