convolution layer을 포함하는 model을 직접 만들 때, convolution 후의 output shape을 이용하여 다음 레이어에 넘겨줘야 하는 경우가 있다. 내 기억에는 좀 더 간단하게 모델을 만들 수 있는 Keras 같은 경우에는 우리가 output shape을 계산해야 할 필요는 없지만(그냥 convolution layer을 계속 쌓으면 알아서 output shape을 계산해서 넘겨주는 것 같다), 더 deep 한 level을 건들 수 있는 tensorflow를 이용하여 model을 만들 때는, Convolution후의 shape을 코드를 짜는 사람이 직접 다음 레이어와 맞춰줘야 하는 경우가 많다.

 

그래서 convolution 후의 shape을 구하는 공식을 알아보려고 한다. 물론, convolution이 어떻게 계산되는지 잘 모르는 경우에는 직접 작은 예제(ex, 10x10 image, 2x2 filter, stride=1, padding =(1,1,1,1))등으로 한 번 output shape을 계산해 보는 것을 정말 추천한다! 필자는 직접 해봐서 공식을 유도해봤는데, 예전 수능 수학 공부하던 시절이 떠올라서 잠시나마 추억에 젖었었다. 하지만 매번 공식을 유도해서 output shape을 계산할 순 없으니! 공식을 알아보자. 이전에는 계속 까먹어서 매번 구글링을 해서 사용을 했지만(구글링 하면 쉽게 바로 나온다), 블로그도 시작한 겸 여기다가 구글링 해서 찾은 것을 그래도 적어보자 한다.

 

you can use this formula [(W−K+2P)/S]+1.

  • W is the input volume - in your case 128
  • K is the Kernel size - in your case 5
  • P is the padding - in your case 0 i believe
  • S is the stride - which you have not provided.

So, we input into the formula:

Output_Shape = (128-5+0)/1+1 Output_Shape = (124,124,40)

NOTE: Stride defaults to 1 if not provided and the 40 in (124, 124, 40) is the number of filters provided by the user.

[reference: https://stackoverflow.com/questions/53580088/calculate-the-output-size-in-convolution-layer]

 

한 번 더 정리해보자면, W는 image size다. image의 height, width가 다른 경우(정사각형이 아닌 경우) height과 width를 각각 W에 적용해서 구하면 된다. K는 kernel(filter라고 불리기도 한다) 사이즈이다. P는 얼마큼 패딩을 하는지를 의미한다. S는 스트라이드(필터를 몇 칸 씩 건너뛸 것인지)를 의미한다. 이 공식을 이용하여 output shape을 쉽게 구할 수 있다!

 

참고로, kernel을 움직이다가 rightmost, bottommost 쪽에 자투리가 남을 수도 있을 것이다. 그때는 padding='same' or padding='valid'(tf & keras 기준) 둘 중 어떤 방식을 사용했는지 체크하고 자투리에 적용하면 된다!(same과 valid가 어떻게 다른지 궁금하다면 구글링을 해보자! 나중에 시간이 나면 저 둘의 차이에 대해 포스팅을 해보겠다)

 

+ Recent posts