赞
踩
目录
除了之前提到的卷积核大小,还有什么因素会影响输出的大小呢?下面将介绍填充和步幅。
假设以下情景: 有时,在应用了连续的卷积之后,我们最终得到的输出远小于输入大小。这是由于卷积核的宽度和高度通常大于1所导致的。比如,一个240×240像素的图像,经过10层5×5的卷积后,将减少到200×200像素。如此一来,原始图像的边界丢失了许多有用信息。而填充是解决此问题最有效的方法; 有时,我们可能希望大幅降低图像的宽度和高度。例如,如果我们发现原始的输入分辨率十分冗余。步幅则可以在这类情况下提供帮助。
卷积神经网络(Convolutional Neural Network,CNN)中的填充(Padding)和步幅(Stride)是两个重要的概念,它们用于控制卷积层的输出大小和感受野。
为什么使用填充?
卷积核在有限空间的图像上会逐层减少输出元素大小。
实际作用效果:
常用的填充经验:
代码实现,上下左右都填充一条:
- import torch
- from torch import nn
-
- # 为了方便起见,我们定义了一个计算卷积层的函数。
- # 此函数初始化卷积层权重,并对输入和输出提高和缩减相应的维数
- def comp_conv2d(conv2d, X):
- # 这里的(1,1)表示批量大小和通道数都是1
- X = X.reshape((1, 1) + X.shape)
- Y = conv2d(X)
- # 省略前两个维度:批量大小和通道
- return Y.reshape(Y.shape[2:])
-
- # 请注意,这里每边都填充了1行或1列,因此总共添加了2行或2列
- conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1)
- X = torch.rand(size=(8, 8))
- comp_conv2d(conv2d, X).shape
- #torch.Size([8, 8])
更灵活地填充(由于k是5*3,就要填充4*2,于是上下左右填充2*1):
- conv2d = nn.Conv2d(1, 1, kernel_size=(5, 3), padding=(2, 1))
- comp_conv2d(conv2d, X).shape
-
- #torch.Size([8, 8])
为什么使用步幅?
实际使用:
代码实现:
- 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])
综合起来,填充和步幅是卷积神经网络中的两个重要超参数,它们可以调整输出特征图的尺寸、感受野以及网络的计算和内存需求。通过合理选择填充和步幅,可以更好地适应不同问题的需求,同时确保网络有效地提取特征。这些概念对于卷积神经网络的设计和训练非常关键。
本章又多了两个超参数,除了基础的MLP超参数以外,现在有了:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。