➊~➎는 입력된 값의 차원을 축소시키는 인코딩 부분이고 ➏~는 다시 차원을 점차 늘려 입력 값과 똑같은 크기의 출력 값을 내보내는 디코딩 부분입니다. 두 부분이 하나의 Sequential() 함수로 쭉 이어져 오토인코더 모델을 만듭니다.
인코딩 파트에서 입력 크기를 줄이는 방법으로 맥스 풀링(16.4절 참조)을 사용했습니다(➋, ➍). 반대로 디코딩 부분에서는 크기를 늘리기 위해 앞에서 배운 UpSampling을 썼습니다(➐, ➒, ).
여기서 놓치지 말아야 할 것은 ➊에서 입력된 28×28 크기가 층을 지나면서 어떻게 바뀌는지 파악하는 것입니다. 입력된 값은 MaxPooling 층 ➋, ➍를 지나면서 절반씩 줄어들 것이고, Upsampling 층 ➐, ➒, 을 지나면서 두 배로 늘어납니다. 그렇다면 이상한 점이 하나 있습니다. 어째서 MaxPooling 층은 두 번이 나오고 Upsampling 층은 세 번이 나올까요? 이대로라면 처음 입력된 28×28보다 더 크게 출력되는 것은 아닐까요?
해답은 ➓에 있습니다. 잘 보면 padding 옵션이 없습니다. 크기를 유지시켜 주는 패딩 과정이 없으므로 커널이 적용되면서 크기가 줄어듭니다. 이를 다시 확인하기 위해 전체 구조를 확인해 보면() 다음과 같습니다.