transposed Convolutional Layer는 Deconvolutional layer라고 잘못알려져 있습니다.
Deconvonutional layer는 일반적인 convolutional layer의 반대버전으로
예를 들어 일반적인 convolutional layer를 거쳐 맏들어진 output이 deconvolve된다면
우리는 원본 input으로 되돌릴수 있습니다.
transposed convolutional layer는 만들어내는 어떤 공간적인 차원이 같다는점에서 deconvolutional이랑 비슷합니다. 하지만 Transposed convoluton은 일반적인 convolutional를 값은 되돌리지 못하고(원본 input과 달라지고) 차원만 되돌려 줄 뿐입니다.
trnasposed convolution layer는 정확하게 일반적인 convolutional layer가 작동하는 방식과 같습니다. 그러나 input feature map의 측면에서 조금 다릅니다. 일단 한번 일반적인 convolutional layer의 작용에 대해 알아봅시다.
3줄 요약
일반적인 convolutional layer는 input
x 에다 다음의 2가지 parameter로 결정됩니다.
Padding (p) : 원본 input 주번에 패드되는 0들의 숫자를 결정합니다.
output은 원본 이미지를 x 로 증가시킵니다.
Strid(s) : kernel(filter)가 한번에 몇칸씩 이동하는가를 결정함니다.
첫번째로 input image는 0들로 패딩해줍니다., 두번째로 패딩된 이미지에 kenrnel을 위치시키고 커널과 커널이 감싸는 input지역의 내적(dot product)계산을 통해 ouput 픽셀을 계산해냅니다. 그러면서 kernel은 s만큼 지정된 칸만큼 이동합니다. convlutional layer는 주로 down-sampling의 효과가 있고, 아웃풋의 공간적 차원은 input의 차원보다 작습니다.
아래는 다른 stride와 padding의 예시입니다.
일반적인 convolution layer에서
의 가 주어졌을때
한변의 길이 는 아래의 공식을 따릅니다.
transposed Convolutional layer는 반대로 주로 upsamping을 실행합니다. 즉 input 보다 output의 공간적 차원이 더 큽니다. 일반적인 convolutional과 동일하게 역시 padding과 stride를 통해서 정의할 수 있습니다. 이런 padding과 stride값들은 이론적으로 output에 대하여 input을 만들어내기 위한 값입니다. 예를 들어 output에다가 stride와 padding의 값을 가지고 일반적인 Convoltuion을 한다면, input과 동일한 공간적 차원을 만들어낼 것입니다.
Transposed Convlutional layer는 4단계로 설명합니다.
Step 1 : 새로운 parameter 와 을 계산해냅니다.
, ,
Step 2: input의 각 행과 열사이에 z 만큼의 0을 삽입합니다.
이것은 input의 사이즈를 x 만큼 증가시킵니다.
Step 3: 2에서 변형된 input에다 만큼의 0을 패딩해줍니다.
Step 4: 3까지 변형된 input에다 stride 1인 일반적인 convolution을 진행합니다.
그림으로 살펴보면 아래와 같습니다.
애니메이션으론 아래와 같습니다.
transposed colvolution에서 output size는 아래와 같습니다.
의 가 주어졌을때
한변의 길이 는 아래의 공식을 따릅니다.
실제 텐서플로 keras layer의 Conv2DTranspose을 사용하면 위의 공식이 맞지않을수도있다.
model.add(layers.Conv2DTranspose(128, kernel_size=(5, 5), strides=(2, 2), padding= 'same', use_bias=False))
이렇게 padding = "same" 옵션을 주면 단순하게
가 된다.
Conv 타입 | 연산 | 0 삽입 | 패딩 | 스트라이드 | 아웃풋 사이즈 |
---|---|---|---|---|---|
일반적 | 다운 샘플링(size 감소) | 0(없음) | p | s | (i + 2p - k)/ s + 1 |
Transpoed | 업 샘플링(size 증가) | (s-1) | (k-p-1) | 1 | (i-1)*s+k-2p |
transposed convolution의 아이디어는 학습할수있는 upsamping을 하는것.
transposed convolution은 일반적인 convoltuion과 비슷하나 input에 변형을 가함
stride와 padding은 일반적 convolution 연산에서 하는 역할(input주변에 0 패딩, kernel 이동의 칸수)를 하지않음
파이썬 코드
Python Code:
The gifs were generated using python. The complete code can be found at https://github.com/aqeelanwar/conv_layers_animation
역자주
텐서플로 keras의 Con2DTranspose를 참고할 것
https://www.tensorflow.org/api_docs/python/tf/keras/layers/Conv2DTranspose