019、卷积层填充和步幅

之——调整控制卷积层输出大小

目录

之——调整控制卷积层输出大小

杂谈

 正文

1.填充(Padding):

2.步幅(Stride):

小结


杂谈

        除了之前提到的卷积核大小,还有什么因素会影响输出的大小呢?下面将介绍填充步幅

        假设以下情景: 有时,在应用了连续的卷积之后,我们最终得到的输出远小于输入大小。这是由于卷积核的宽度和高度通常大于1所导致的。比如,一个240×240像素的图像,经过10层5×5的卷积后,将减少到200×200像素。如此一来,原始图像的边界丢失了许多有用信息。填充是解决此问题最有效的方法; 有时,我们可能希望大幅降低图像的宽度和高度。例如,如果我们发现原始的输入分辨率十分冗余。步幅则可以在这类情况下提供帮助。

        卷积神经网络(Convolutional Neural Network,CNN)中的填充(Padding)和步幅(Stride)是两个重要的概念,它们用于控制卷积层的输出大小和感受野。


 正文

1.填充(Padding)

        为什么使用填充?

        卷积核在有限空间的图像上会逐层减少输出元素大小。 

  • 填充是指在输入图像周围添加额外的像素值(通常是0)以扩展输入的尺寸。这些额外的像素位于输入图像的边界,可以是单层或多层像素。
  • 填充有两种主要类型:有效(Valid)填充相同(Same)填充
    • 有效填充:不进行填充,输出尺寸会比输入尺寸小。这意味着卷积核只与输入中完全包含它的区域进行卷积操作。VALID不进行填充,当滑动卷积核之后,若多出一列,“Vaild”发现余下的窗口不到卷积核大小,会就把剩下的一列直接去了(图片卷积后还是会变小)。
    • 相同填充:在输入周围添加填充,使输出尺寸与输入尺寸相同。这有助于保持输入特征图的尺寸,通常在需要精确位置信息时使用。SAME进行填充,当滑动卷积核之后,若多出一列,“Same”发现余下的窗口不到卷积核大小并不会把多出的一列丢弃,但是只有一列了不够卷积核大小怎么办?填充!会在原图像外围添加一圈或者多圈全“0”(图片卷积后可能不会变小)。
  • 填充可以帮助控制输出的尺寸,以便与后续层的输入兼容。它还有助于防止信息丢失在卷积操作中的边界像素上。
  • 相同填充可以保持特征图的尺寸,这在堆叠多个卷积层时非常有用,因为它允许网络更好地学习不同尺寸的特征。

        实际作用效果:

         常用的填充经验:

        代码实现,上下左右都填充一条:

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])

2.步幅(Stride)

        为什么使用步幅?

  • 步幅是卷积核在输入上滑动的步长。它决定了卷积操作的间隔,即卷积核从一个位置移动到下一个位置的距离。
  • 步幅通常设置为1,这意味着卷积核在每次移动时只移动一个像素。较大的步幅值将导致输出特征图的尺寸减小。
  • 步幅可以用于减小输出特征图的尺寸。这对于减少计算量和参数数量非常有用,因为较小的特征图需要更少的计算。
  • 步幅还可以用于改变特征图的感受野大小。较大的步幅会导致感受野减小,而较小的步幅会导致感受野增加,这可以影响网络对不同特征的感知能力。

        实际使用:

        代码实现:

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超参数以外,现在有了:

  • 卷积核大小
  • 填充方法
  • 步幅大小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Here-We-Are

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

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

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

打赏作者

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

抵扣说明:

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

余额充值