합성곱 신경망(Convolutional Neural Network, CNN)은 일반적으로 합성곱 레이어(Convolutional Layer), 풀링 레이어(Pooling Layer), 밀집 레이어(Dense Layer)의 조합으로 구성됩니다.
관련 글: TensorFlow란 무엇이며, Keras는 어떻게 TensorFlow와 함께 작동하여 신경망을 만들까요?
합성곱 신경망은 이미지 인식과 같은 특정 유형의 문제에서 탁월한 성능을 입증해 왔습니다. 이러한 네트워크는 'models' 클래스에 포함된 'Sequential' 메서드를 사용해 손쉽게 만들 수 있으며, 'add' 메서드를 통해 레이어를 하나씩 추가할 수 있습니다.
이번 예제에서는 Keras Sequential API를 활용합니다. Sequential API는 각 레이어가 정확히 하나의 입력 텐서와 하나의 출력 텐서를 갖는 순차적 모델(plain stack of layers)을 구축할 때 매우 유용합니다.
아래 코드는 Google Colaboratory 환경에서 실행되었습니다. Google Colab은 별도의 설정 없이 브라우저에서 바로 Python 코드를 실행할 수 있게 해주며, GPU(그래픽 처리 장치)를 무료로 사용할 수 있다는 큰 장점이 있습니다. Colaboratory는 Jupyter Notebook을 기반으로 만들어졌습니다.
print("Creating the convolutional base")
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
print("Description of architecture is")
model.summary()
코드 출처: https://www.tensorflow.org/tutorials/images/cnn
실행 결과
Creating the convolutional base Description of architecture is Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d (Conv2D) (None, 30, 30, 32) 896 _________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 15, 15, 32) 0 _________________________________________________________________ conv2d_1 (Conv2D) (None, 13, 13, 64) 18496 _________________________________________________________________ max_pooling2d_1 (MaxPooling2 (None, 6, 6, 64) 0 _________________________________________________________________ conv2d_2 (Conv2D) (None, 4, 4, 64) 36928 ================================================================= Total params: 56,320 Trainable params: 56,320 Non-trainable params: 0
코드 설명
위 코드는 널리 사용되는 일반적인 패턴을 따라 합성곱 베이스(convolutional base)를 정의합니다.
이 패턴은 Conv2D 레이어와 MaxPooling2D 레이어를 교대로 쌓아 올리는 구조입니다.
CNN의 입력은 (이미지_높이, 이미지_너비, 색상_채널) 형태의 텐서입니다.
이 예제에서 CNN은 CIFAR 이미지 형식인 (32, 32, 3) 크기의 입력을 처리하도록 설정되어 있습니다.
입력 형태는 첫 번째 레이어에 input_shape 인자를 전달하는 방식으로 지정할 수 있습니다.
모든 Conv2D 및 MaxPooling2D 레이어의 출력은 (높이, 너비, 채널) 형태의 3D 텐서입니다.
네트워크가 깊어질수록 출력의 너비와 높이 차원은 점점 줄어듭니다.
반면 각 Conv2D 레이어의 출력 채널 수는 첫 번째 인자(예: 32 또는 64)에 의해 결정되므로, 채널 수는 네트워크가 깊어지면서 늘어나는 것이 일반적입니다.
참고로, 위에서 구축한 합성곱 베이스 뒤에 Flatten 레이어와 Dense 레이어를 추가하면 이미지 분류와 같은 최종 작업을 수행하는 완전한 CNN 모델을 완성할 수 있습니다.