卷积基础篇——填充和步幅

填充

问题提出

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

问题解决

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个像素

import torch
from torch import nn

def comp_conv2d(conv2d,X):
    X = X.reshape((1,1)+X.shape)
    Y = conv2d(X)
    return Y.reshape(Y.shape[2:])

#padding 填充数 stride 步幅
conv2d = nn.Conv2d(1,1,kernel_size=(3,5),padding=(0,1),stride=(3,4))
X = torch.rand(size=(8,8))
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$

  • 17
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值