动手学深度学习——卷积层里的填充和步幅

1、填充

填充( padding )是指在输⼊⾼和宽的两侧填充元素(通常是 0 元素)。

给定(32x32)输入图像;

应用5x5大小的卷积核,第一层得到输出大小28x28,第七层得到输出大小4x4;

更大的卷积核可以更快的减少输出大小,形状从n_{h}\times n_{w}减少到\left ( n_{h} -k_{h}+1\right )\times \left ( n_{w} -k_{w}+1\right )。也就是行数和列数会较少。

注:当想用一个大的卷积核又不想减少输出怎么办?

就是进行填充,在输入的周围添加额外的行或者列。

动手学深度学习——卷积层里的填充和步幅_第1张图片

 

在很多情况下,
我们会设置p_{h}=k_{h}-1p_{w}=k_{w}-1来使输⼊和输出具有相同的⾼和宽。
这样会⽅ 便在构造⽹络时推测每个层的输出形状。
  • 假设这⾥ k_{h}是奇数,我们会在⾼的两侧分别填充 \frac{p_{h}}{2}⾏。
  • 如 果k_{h} 是偶数,⼀种可能是在输⼊的顶端⼀侧填充\frac{p_{h}}{2}⾏,⽽在底端⼀侧填充\frac{p_{h}}{2}⾏。
  • 在宽的两侧 填充同理.

2、步幅

步幅是指行或者列的滑动步长。往右边走多少列,往下边走多少行。

填充减小的输出大小与层数线性相关,给定输出大小224x224,在使用5x5卷积核的情况下,需要44层将输出降到4x4;需要大量的计算才能得到较小输出。

动手学深度学习——卷积层里的填充和步幅_第2张图片

 动手学深度学习——卷积层里的填充和步幅_第3张图片

 3、总结

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

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

步幅是每次滑动核窗口时的行或者列,可以成倍的减少输出形状。

代码学习:

"""
下⾯的例⼦⾥我们创建⼀个⾼和宽为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)
#in_channels=1, out_channels=1,表示上下左右各填充一行
#kernel_size=3,表示核的大小是3x3

X = torch.rand(8, 8) #输入一个随机的8x8的矩阵
#输出
print(comp_conv2d(conv2d, X).shape)

"""当卷积核的⾼和宽不同时,我们也可以通过设置⾼和宽上不同的填充数使输出和输⼊具有相同的⾼和
宽。 """
# 填充不同的高度和宽度,使⽤⾼为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

print(comp_conv2d(conv2d, X).shape)

""" 将每次滑动的⾏数和列数称为步幅(stride)。
令⾼和宽上的步幅均为2,从⽽使输⼊的⾼和宽减半
"""
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)
#stride=2,表示步幅为2
print(comp_conv2d(conv2d, X).shape)

""" 下面是复杂点的例子"""
conv2d = nn.Conv2d(1, 1, kernel_size=(3, 5), padding=(0, 1), stride= (3, 4))

print(comp_conv2d(conv2d, X).shape)

动手学深度学习——卷积层里的填充和步幅_第4张图片

 

你可能感兴趣的:(动手学深度学习,深度学习,cnn,计算机视觉)