4.2.4 flatten 층과 밀집 층
입력 텐서가 두 그룹의 conv2d-maxPooling2d 변환을 통과하고 나면 (배치 차원을 제외하고) HWC 크기가 [4, 4, 16]인 텐서가 됩니다. 이 합성곱 신경망에 있는 다음 층은 flatten 층입니다. 이 층은 conv2d-maxPooling2d 층과 시퀀셜 모델의 다음 층 사이의 다리 역할을 수행합니다.
flatten 층21의 코드는 간단하며 어떤 매개변수도 필요하지 않습니다.
model.add(tf.layers.flatten());
flatten 층은 전체 원소 개수를 유지하면서 다차원 텐서를 1D 텐서로 펼칩니다. 이 경우에 (배치 차원을 제외하고) [3, 3, 32] 크기의 3D 텐서를 [288] 크기의 1D 텐서로 펼칩니다. 원본 3D 공간에는 고유한 순서가 없기 때문에 당연히 어떻게 원소를 나열하는지가 궁금합니다. 원소를 1D 텐서로 펼치고 (3D 텐서의) 원래 인덱스가 어떻게 변하는지 살펴보면 마지막 인덱스가 가장 빠르게 변하고, 그다음 마지막에서는 두 번째 인덱스가 두 번째로 빠르게 변하는 식입니다. 첫 번째 인덱스는 가장 느리게 바뀝니다. 그림 4-7에 이 내용이 잘 나타나 있습니다.
▲ 그림 4-7 flatten 층의 작동 방식. 3D 텐서가 입력된다고 가정한다. 간단하게 나타내기 위해 각 차원의 크기를 2로 가정한다. 원소의 인덱스는 원소를 나타내는 정육면체의 면에 나타나 있다. flatten 층이 원소의 전체 개수를 유지하면서 3D 텐서를 1D 텐서로 변환한다. 출력된 1D 텐서의 원소를 따라가면서 입력 텐서의 원본 인덱스를 조사해 보면 펼쳐진 1D 텐서에 있는 원소의 순서는 마지막 차원이 가장 빨리 변한다.