TensorFlow에서는 Sequential 모델에 add 메서드를 사용하고 레이어 유형을 Dense로 지정하여 밀집(Dense) 레이어를 손쉽게 추가할 수 있습니다. 이때 합성곱 기반(convolutional base)의 출력은 먼저 Flatten 레이어로 평탄화한 뒤 Dense 레이어가 이어지며, 새로 추가된 레이어는 전체 학습 데이터셋에 적용됩니다.
관련 글: TensorFlow란 무엇이며, Keras는 TensorFlow와 함께 어떻게 신경망을 구성할까요?
Keras Sequential API 활용
이 튜토리얼에서는 Keras의 Sequential API를 사용합니다. Sequential API는 각 레이어가 정확히 하나의 입력 텐서와 하나의 출력 텐서를 가지는 단순한 레이어 스택 구조의 모델을 만들 때 매우 유용합니다.
실행 환경: Google Colaboratory
아래 코드는 Google Colaboratory(Colab)에서 실행됩니다. Colab은 브라우저에서 바로 Python 코드를 실행할 수 있도록 도와주며, 별도의 설정 없이 무료로 GPU(그래픽 처리 장치)를 사용할 수 있다는 장점이 있습니다. Colaboratory는 Jupyter Notebook을 기반으로 구축되었습니다.
Dense 레이어 추가 코드
print("Adding dense layer on top")
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10))
print("Complete architecture of the model")
model.summary()코드 출처: https://www.tensorflow.org/tutorials/images/cnn
실행 결과
Adding dense layer on top Complete architecture of the model Model: "sequential_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_3 (Conv2D) (None, 30, 30, 32) 896 _________________________________________________________________ max_pooling2d_2 (MaxPooling2 (None, 15, 15, 32) 0 _________________________________________________________________ conv2d_4 (Conv2D) (None, 13, 13, 64) 18496 _________________________________________________________________ max_pooling2d_3 (MaxPooling2 (None, 6, 6, 64) 0 _________________________________________________________________ conv2d_5 (Conv2D) (None, 4, 4, 64) 36928 _________________________________________________________________ flatten (Flatten) (None, 1024) 0 _________________________________________________________________ dense (Dense) (None, 64) 65600 _________________________________________________________________ dense_1 (Dense) (None, 10) 650 ================================================================= Total params: 122,570 Trainable params: 122,570 Non-trainable params: 0 _________________________________________________________________
동작 원리 설명
- 모델을 완성하려면 합성곱 기반(convolutional base)의 마지막 출력 텐서(형태: (4, 4, 64))를 하나 이상의 Dense 레이어에 입력하여 분류 작업을 수행해야 합니다.
- Dense 레이어는 1차원 벡터만 입력으로 받을 수 있지만, 현재 출력은 3차원 텐서입니다.
- 따라서 먼저 3차원 출력을 1차원으로 평탄화(Flatten)한 후, 그 위에 하나 이상의 Dense 레이어를 추가합니다.
- CIFAR 데이터셋은 10개의 출력 클래스를 가지므로, 마지막에는 출력 개수가 10개인 Dense 레이어를 추가합니다.
- (4, 4, 64) 형태의 출력은 두 개의 Dense 레이어를 통과하기 전에 (1024) 크기의 벡터로 평탄화됩니다.