FCN에서Transposed conv를 사용해32배,16배,8배로Upscaling해주는 연산이 어떻게 딱딱n배로 떨어지는지 이해가 가지않아 직접 그림을 그리고 점화식(?)을 도출해 보았다.- 편의를 위해 1차원의 그림으로 표현하였다
input의 크기w를 2,kernel size를 3,stride의 크기를 2,padding의 크기를 1이라고 가정해보자
- 직접 그림으로 그려보면 위의 그림과 같은
shape을 얻을 수 있다.- 처음의
k만큼의shape이 생기고 그 다음 남은input의 크기(w-1)만큼s가 추가된다.- 그 후 양쪽 끝에서
p만큼 사이즈가 줄어든다.- 따라서 라는 식을 세울 수 있고, 위의 그림의 값을 대입해보면 이라는 결과를 얻을 수 있다.
- 이라고 가정해보자
- 이번에도 마찬가지로 한 번의 만큼
shape이 추가된 이후 남은input의 크기()만큼s가 추가되는 것을 확인할 수 있다.- 그 후 양쪽 끝에서
padding크기만큼 사이즈가 줄어든다.
(a)
Transposed Conv의output shape을 계산하는 식을 정리해보면 위의 식 (a)를 얻을 수 있다.
- 해당 식을 사용해
input의 n배크기의 영상을 얻고 싶을 때는 다음과 같이 할 수 있다.
(b)
- (b)의 값을 (a)의 식에 대입하면, 아래와 같은 식 (c)가 나온다
(c)
- 위의 식 (c)에서, 첫번째항과 세번째항을 먼저 연산하면 이 남는다. 따라서,
(d)
라는 식이 남게되고, 위의 두 항을 더해주면
결국
만 남게되어,input sizew에n배한output을 얻을 수 있게 된다.
Transposed Conv를 통해feature map을n배하고 싶을 때에는,kernel size=2n,stride=n,padding=1/2n을 해주도록 하자.