填充和步幅

《动手学深度学习pytorch》部分学习笔记,仅用作自己复习。

填充和步幅

填充 

填充(padding)是指在输入⾼和宽的两侧填充元素(通常是0元素)。图5.2⾥我们在原输入⾼和宽的两侧分别添加了值为0的元素,使得输入⾼高和宽从3变成了5,并导致输出高和宽由2增加到4

 卷积神经网络经常使用奇数高宽的卷积核,如1、3、5和7,所以两端上的填充个数相等。对任意的⼆维数组 X ,设它的第 i行第 j 列的元素为 X[i,j] 。当两端上的填充个数相等,并使输入和输出具有相同的⾼和宽时,我们就知道输出 Y[i,j] 是由输⼊以 X[i,j] 为中心的窗口同卷积核进行互相关计算得到的。
下面的例子⾥我们创建⼀个⾼和宽为3的二维卷积层,然后设输⼊高和宽两侧的填充数分别为1。给定⼀个⾼和宽为8的输入,我们发现输出的高和宽也是8。

import torch
from torch import nn
# 定义⼀个函数来计算卷积层。它对输⼊和输出做相应的升维和降维
def comp_conv2d(conv2d, X):
    # (1, 1)代表批量⼤小和通道数均为1
    X = X.view((1, 1) + X.shape)
    Y = conv2d(X)
    return Y.view(Y.shape[2:]) # 排除不关心的前两维:批量和通道
    # 注意这⾥是两侧分别填充1⾏或列,所以在两侧一共填充2⾏或列
conv2d = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=3,padding=1)
X = torch.rand(8, 8)
comp_conv2d(conv2d, X).shape

输出:torch.Size([8, 8]) 

当卷积核的高和宽不同时,我们也可以通过设置高和宽上不同的填充数使输出和输⼊具有相同的高和宽。

# 使⽤高为5、宽为3的卷积核。在高和宽两侧的填充数分别为2和1
conv2d = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=(5,3), padding=(2, 1))
comp_conv2d(conv2d, X).shape

输出:torch.Size([8, 8]) 

 步幅

卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输⼊数组上滑动。我们将每次滑动的⾏数和列数称为步幅(stride)。

图5.3展示了在⾼上步幅为3、在宽上步幅为2的⼆维互相关运算。可以看到,输出第一列第二个元素时,卷积窗⼝向下滑动了3⾏行,⽽在输出第一⾏第⼆个元素时卷积窗口向右滑动了2列。当卷积窗口在输⼊上再向右滑动2列时,由于输入元素⽆法填满窗⼝口,⽆结果输出。

下⾯我们令⾼和宽上的步幅均为2,从⽽使输⼊的高和宽减半。

conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)
comp_conv2d(conv2d, X).shape

输出:torch.Size([4, 4]) 

接下来是⼀个稍微复杂点儿的例子。

conv2d = nn.Conv2d(1, 1, kernel_size=(3, 5), padding=(0, 1), stride=(3, 4))
comp_conv2d(conv2d, X).shape

输出:torch.Size([2, 2]) 

小结

  • 填充可以增加输出的⾼和宽。这常⽤来使输出与输入具有相同的⾼和宽。
  • 步幅可以减⼩输出的高和宽,例如输出的高和宽仅为输入的高和宽的1/n ( n为⼤于1的整数)。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clark-dj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值