当前位置:   article > 正文

卷积基础篇——填充和步幅_卷积层里的填充和步幅

卷积层里的填充和步幅

填充

问题提出

当输入图像的维度不大,还想要实现深层的神经网络。

问题解决

1. 填充:扩大输入的维度,在输入的四周添加元素(通常填充为0,防止人为因素对输出结果产生影响)

2. 填充p_h行和p_w列,输出形状为(n_h-k_h+p_h+1)\times(n_w-k_w+p_w+1)

(下标为h代表高,下标为w代表宽,n为原输入的大小,k为卷积核,p为填充数)

3. 通常取p_h=k_h-1,p_w=k_w-1,是输出维度始终比输入维度多1

4. 当k_{h/w}为奇数:在上下(左右)分别填充p_{h/w}/2

    当k_{h/w}为偶数:在上(左)侧填充\left \lceil p_{h/w}/2 \right \rceil,在下(右)侧填充\left \lfloor p_{h/w}/2 \right \rfloor  (或者相反)

步幅

问题提出

当输入图像的维度很大,在卷积核不大的情况下,要想使输出维度变得很小,会导致层数很深

问题解决

1. 步幅:行列的滑动步长

2. 输出:\left \lfloor (n_h-k_h+p_h+s_h)/s_h \right \rfloor\times \left \lfloor (n_w-k_w+p_w+s_w)/s_w \right \rfloor

                (s是步幅大小)

总结

1. 填充和步幅是卷积层的超参数

2. 填充在输入周围添加额外的行和列,来控制输出形状的减少量

3. 步幅是每次滑动卷积核时行/列的步长,可以成倍的减少输出形状

代码

在所有侧边填充1个像素

  1. import torch
  2. from torch import nn
  3. def comp_conv2d(conv2d,X):
  4. X = X.reshape((1,1)+X.shape)
  5. Y = conv2d(X)
  6. return Y.reshape(Y.shape[2:])
  7. #padding 填充数 stride 步幅
  8. conv2d = nn.Conv2d(1,1,kernel_size=(3,5),padding=(0,1),stride=(3,4))
  9. X = torch.rand(size=(8,8))
  10. comp_conv2d(conv2d,X).shape

注意:p_h代表的上下添加的行数之和,而padding参数代表的是一边添加的行数/列数,所以 $p_{h/w}=2\times padding$

\left \lfloor (n_h-k_h+p_h+s_h)/s_h \right \rfloor\times \left \lfloor (n_w-k_w+p_w+s_w)/s_w \right \rfloor

$\left \lfloor (8-3+0+3)/3 \right \rfloor\times \left \lfloor (8-5+1\times 2+4)/4 \right \rfloor = 2\times 2$

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/787168
推荐阅读
相关标签
  

闽ICP备14008679号