搜索
写经验 领红包
 > 房产

滑动窗口算法(滑动窗口协议)

滑动窗口(Sliding Window)

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=&39;或padding=&39;。两者都有利弊。

当我们设置padding=&39;时,卷积窗口将完全停留在输入中。缺点是输出会缩小(丢失像素),并且相对于较大的内核会丢失的更多。这将限制网络可以包含的层的数量,特别是当输入的大小很小时。

另一种方法是使用padding=&39;。这里的诀窍是在输入的边界周围填充0,使用足够的0使输出的大小与输入的大小相同。然而,这可能具有稀释边界处像素的影响的效果。下面的动画显示了一个具有“same”填充的滑动窗口

滑动窗口算法(滑动窗口协议)

我们正在研究的VGG模型对所有卷积层使用相同的填充。大多数现代convnet将使用这两者的某种组合。

4.例子

为了更好地理解滑动窗口参数的影响,可以通过观察低分辨率图像的特征提取来观察各个像素。让我们看一个简单的圆。

滑动窗口算法(滑动窗口协议)

滑动窗口算法(滑动窗口协议)

滑动窗口算法(滑动窗口协议)

滑动窗口算法(滑动窗口协议)

滑动窗口算法(滑动窗口协议)

滑动窗口算法(滑动窗口协议)

下一段代码创建一个映像和内核。

滑动窗口算法(滑动窗口协议)

滑动窗口算法(滑动窗口协议)

VGG体系结构相当简单。它使用步长为1的卷积和2×2的最大池

我们在visiontools实用程序脚本中包含了一个函数,它将显示所有步骤

滑动窗口算法(滑动窗口协议)

而且效果很好!内核是用来检测水平线的,我们可以看到,在生成的特征映射中,输入的水平部分越多,激活程度就越高。

如果我们把卷积的步长改为3,会发生什么?

滑动窗口算法(滑动窗口协议)

这似乎降低了提取的特征的质量。我们的输入圈相当“精细”,只有1像素宽。步长为3的卷积太粗糙,无法从中生成良好的特征图。

有时,一个模型会在它的初始层使用一个更大的步幅的卷积。这通常也会与一个更大的内核相结合。例如,ResNet50模型使用7×7,在它的第一层有stride=2。这似乎加快了大规模特性的生成,而不必牺牲输入的太多信息。

温馨提示:通过以上关于滑动窗口(Sliding Window)内容介绍后,相信大家有新的了解,更希望可以对你有所帮助。