CNN(컨볼루션 신경망) - 차원에 대해 꼭 알아야 하는 것
CNN을 하면서 이런 그림을 많이 본다.
근데 실제 코드를 보고, 데이터의 차원을 보면 이게 어떻게 작동하는지 이해가 가지 않는 부분이 있다.
class Autoencoder(Model):
def __init__(self):
super(Autoencoder, self).__init__()
self.encoder = tf.keras.Sequential([
layers.Input(shape=(28, 28, 1)),
layers.Conv2D(16, (3,3), activation='relu', padding='same', strides=2),
layers.Conv2D(8, (3,3), activation='relu', padding='same', strides=2)])
- 인풋: 28*28*1
- 첫번째 Conv2D 출력: 14*14*16
- 두번째 Conv2D 출력: 7*7*8
첫번째 층은, 입력이 28*28에 strides가 2이니 14, 특성 맵을 16개 만든다 했으니 16이 나온다. 28*28 이미지에서 2칸 간격으로 필터를 사용하면 14*14 이미지가 나오고, 특성 맵이 16개이므로 전체 차원은 14*14*16이 맞다. 그런데 다음 층은? 14*14 이미지 16개를 입력받아서, 이걸 어떻게 7*7 이미지 8개로 만드는거지?
위쪽에 올려둔 저런 이미지로는 이 부분이 제대로 설명되지 않는다.
특징 맵은 3D이고, 모든 연산은 3D의 연산이다.
위쪽의 이미지에서는 2D 특징 맵을 이용해 특징맵 하나를 특징맵 하나로 매핑하는 것만 보여준다. 하지만 실제로는 이렇지 않다. 실제로는 모든 특징 맵이 3D다. (x축, y축, 전 레이어의 특징맵 축) 으로 이루어진 3D 특징 맵은, 전 레이어의 출력과 연산되어 2D 출력을 내놓는다. 특징 맵은 x축과 y축으로만 움직이기 때문에, 2D 출력을 내놓을 수 있다. 이런 2D 출력을 특징맵의 개수만큼 만들어내면, 그 차원이 X*Y*(특징맵의 수)가 되는 것이다.
여기까지 제 3의 축을 그냥 "특징맵 축" 이라고 불렀지만, tensorflow에서는 이것을 채널이라고 부른다.
2D 컨볼루션 레이어의 학습 매개변수의 수
- C: 입력 채널의 수
- F: 필터의 크기
- M: 특징 맵의 수
(param 수) = (C * F^2) * M
특징맵이 삼차원임을 고려하면 당연한 수식이다.
첫번째 레이어에서는 2D고 두번째 레이어부터는 3D? X
첫번째 레이어도 똑같이 3D 특징 맵을 사용한다. 하지만 입력이 하나의 채널만 갖고 있어서, 2D라고 봐도 무방했을 뿐이다.
How do subsequent convolution layers work?
This question boils down to "how do convolution layers exactly work. Suppose I have an $n \times m$ greyscale image. So the image has one channel. In the first layer, I apply a $3\times 3$ convolu...
datascience.stackexchange.com