Pytorch 计算卷积输出的大小

  • A+
所属分类:深度学习
摘要这一篇文章会给出两个计算函数,第一个可以方便根据 input size,kernel size,stride 和 padding 计算出 output size 的大小。第二个可以根据 input size 和 output size 计算出 padding 的大小。

简介

在 Pytorch 中使用卷积会有一个比较麻烦的点,就是当我们设置了 kernel size、stride、pad 之后,不是很好计算 output 的大小。虽然 Pytorch 中提供了计算的式子,但是每次手动计算确实不是很方便。

Pytorch 计算卷积输出的大小

在这一篇文章中,会将上面的式子写成两个两个函数方便使用:

  • 给定了 input size,stride,padding,kernel size 之后很方便的计算出 output size 的大小;
  • 给定 input size,output size,stride 来计算合适的 padding;

参考资料Utility function for calculating the shape of a conv output

 

Pytorch 卷积实用函数

计算 output 的大小

首先比较常用的是,给定了 input size,stride,padding,kernel size 之后计算出 output size 的大小。例如有下面两个函数。

  1. import math
  2. def num2tuple(num):
  3.     return num if isinstance(num, tupleelse (num, num)
  4. def conv2d_output_shape(h_w, kernel_size=1, stride=1, pad=0, dilation=1):
  5.     h_w, kernel_size, stride, pad, dilation = num2tuple(h_w), \
  6.         num2tuple(kernel_size), num2tuple(stride), num2tuple(pad), num2tuple(dilation)
  7.     pad = num2tuple(pad[0]), num2tuple(pad[1])
  8.     h = math.floor((h_w[0] + sum(pad[0]) - dilation[0]*(kernel_size[0]-1) - 1) / stride[0] + 1)
  9.     w = math.floor((h_w[1] + sum(pad[1]) - dilation[1]*(kernel_size[1]-1) - 1) / stride[1] + 1)
  10.     return h, w

首先,利用函数 conv2d_output_shape 来 output 的大小。如下所示:

  • 给定 input size = 28,kernel size =3,stride = 2,pad = 1,最后的 output size 是 14;
  • 给定 input size = 28,kernel size =3,stride = 1,pad = 1,最后的 output size 是 28;
Pytorch 计算卷积输出的大小

 

计算 padding 的大小

还有一个比较常用的是给定了 output size 的大小,想要计算 padding 的大小。

  1. import math
  2. def num2tuple(num):
  3.     return num if isinstance(num, tupleelse (num, num)
  4. def conv2d_get_padding(h_w_in, h_w_out, kernel_size=1, stride=1, dilation=1):
  5.     h_w_in, h_w_out, kernel_size, stride, dilation = num2tuple(h_w_in), num2tuple(h_w_out), \
  6.         num2tuple(kernel_size), num2tuple(stride), num2tuple(dilation)
  7.     p_h = ((h_w_out[0] - 1)*stride[0] - h_w_in[0] + dilation[0]*(kernel_size[0]-1) + 1)
  8.     p_w = ((h_w_out[1] - 1)*stride[1] - h_w_in[1] + dilation[1]*(kernel_size[1]-1) + 1)
  9.     return (math.floor(p_h/2), math.ceil(p_h/2)), (math.floor(p_w/2), math.ceil(p_w/2))

例如下面,我们测试了当不同 stride 下,希望保持 input size 和 output size 一样大小,需要设置的 padding 的大小是多少。

Pytorch 计算卷积输出的大小
  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: