728x90
기존 계산은 다음과 같음.

하지만 pytorch에서 convolution layer output shape를 계산식은 다음과 같음

함수
def cal_conv_output_shape_torch(h_w, layer):
from math import floor
dilation = layer.dilation
kernel_size = layer.kernel_size
stride = layer.stride
pad = layer.padding
if type(dilation) is not tuple:
pass
else :
dilation = dilation[0]
stride = stride[0]
pad = pad[0]
if type(kernel_size) is not tuple:
kernel_size = (kernel_size, kernel_size)
h_out = floor( ((h_w[0] + (2 * pad) - ( dilation * (kernel_size[0] - 1) ) - 1 )/ stride) + 1)
w_out = floor( ((h_w[1] + (2 * pad) - ( dilation * (kernel_size[1] - 1) ) - 1 )/ stride) + 1)
if layer.__class__.__name__ == "MaxPool2d" :
return h_out, w_out
elif layer.__class__.__name__ == "Conv2d" :
c_out = layer.out_channels
return c_out , h_out, w_out예시
(channel_in , h_in , w_in) : (1,32,128)

conv2 d 및 pooling 적용하기
layer1 = nn.Conv2d(in_channels=1, out_channels=5, kernel_size=5, stride=2,padding=0) max_pool1 = nn.MaxPool2d(kernel_size=2)
실제 계산을 하면 다음과 같이 계산된다고 함.
c_out, h_out , w_out = cal_conv_output_shape_torch([32,128],layer1) print(c_out, h_out , w_out) # 5 14 62
h_out , w_out = cal_conv_output_shape_torch([h_out,w_out],max_pool1) print(h_out , w_out) # 7 31
실제 처리값

convolution 계산하는 것이 먼가 항상 외우기 어려우니 함수를 많이 하는 것 같다.
conv2d의 모든 것을 커버하는지는 잘 모르겠다.
discuss.pytorch.org/t/utility-function-for-calculating-the-shape-of-a-conv-output/11173/3
Utility function for calculating the shape of a conv output
I imagine if you wanted a function you could generate a random input, pass it to conv2d, and check the size of the output (this is definitely not efficient but works as a sanity check)
discuss.pytorch.org
'분석 Python > Pytorch' 카테고리의 다른 글
| PyTorch Lighting + Ray tune (0) | 2020.11.07 |
|---|---|
| [TIP / Pytorch] torch class name 얻는 방법 (0) | 2020.10.31 |
| [TIP / Pytorch 1.5~] jit script, save, load (0) | 2020.10.29 |
| [TIP / Installation] requirements.txt 로 pytorch package 설치하는 방법 (1) | 2020.10.25 |
| [TIP / Pytorch] Linear NN Model base Architecture (0) | 2020.10.23 |