1.介绍
卷积和池化操作有一个共同的特点:它们都是在滑动窗口上执行的。在卷积运算中,这个“窗口”是由内核的维数,参数kernel_size给出的。对于池,它是池大小给定的。
有两个额外的参数同时影响卷积层和池层——它们是窗口的步长和是否在图像边缘使用填充。strides参数表示窗口在每一步应该移动多远,padding参数描述如何处理输入边缘的像素。
有了这两个参数,定义的两个图层就变成了:
2.Stride
窗口在每一步移动的距离称为stride。我们需要在图像的两个维度上指定步幅:一个用于从左到右移动,另一个用于从上到下移动。这个动画显示了strides=(2,2),每一步移动2个像素。
步幅有什么影响流量套餐?当任一方向上的步长大于1时,滑动窗口将在每一步跳过输入中的一些像素。因为我们需要高质量的特征用于分类,卷积层通常会有strides=(1,1)。增加步幅意味着我们总结时遗漏了潜在的有价值的信息。但是,最大池化层的跨距值几乎总是大于1,如(2,2)或(3,3),但不大于窗口本身。
注意,当两个方向的步幅值相同时,只需设置该数字;例如,您可以使用strips=2作为参数设置,而不是strips=(2,2)。
3.Padding
在执行滑动窗口计算时,存在一个问题,即在输入边界处做什么。完全停留在输入图像中意味着窗口永远不会像对待输入图像中的其他像素那样垂直地放置在这些边界像素上。既然我们不是对所有像素流量套餐都一视同仁,那会有问题吗?
卷积对这些边界值的作用是由它的填充参数决定的。在TensorFlow中,有两个选择:padding=same或padding=valid。两者都有利弊。
当我们设置padding=valid时,卷积窗口将完全停留在输入中。缺点是输出会缩小(丢失像素),并且相对于较大的内核会丢失的更多。这将限制网络可以包含的层的数量,特别是当输入的大小很小时。
另一种方法是使用padding=same。这里的诀窍是在输入的边界周围填充0,使用足够的0使输出的大小与输入的大小相同。然而,这可能具有稀释边界处像素的影响的效果。下面的动画显示了一个具有“same”填充的滑动窗口
我们正在研究的VG流量套餐G模型对所有卷积层使用相同的填充。大多数现代convnet将使用这两者的某种组合。
4.例子
为了更好地理解滑动窗口参数的影响,可以通过观察低分辨率图像的特征提取来观察各个像素。让我们看一个简单的圆。
下一段代码创建一个映像和内核。
VGG体系结构相当简单。它使用步长为1的卷积和2×2的最大池
我们在visiontools实用程序脚本中包含了一个函数,它将显示所有步骤
而且效果很好!内核是用来检测水平线的,我们可以看到,在生成的特征映射中,输入的水平部分越多,激活程度就越高。
如果我们把卷积的步长改为3,会发生什么?
这似乎降低了提取的特征的质量。我们的输入圈相当“精细”,只有1像素宽。步长为3的卷积太粗糙,流量套餐无法从中生成良好的特征图。
有时,一个模型会在它的初始层使用一个更大的步幅的卷积。这通常也会与一个更大的内核相结合。例如,ResNet50模型使用7×7,在它的第一层有stride=2。这似乎加快了大规模特性的生成,而不必牺牲输入的太多信息。
友情提醒: 请添加客服微信进行免费领取流量卡!
QQ交流群:226333560 站长微信:qgzmt2
原创文章,作者:sunyaqun,如若转载,请注明出处:https://www.dallk.cn/54652.html