跨步卷积和非跨步卷积之间的区别

机器算法验证 神经网络 卷积神经网络 张量流
2022-03-29 05:18:18
conv = conv_2d (strides=)

我想知道非跨步卷积在什么意义上与跨步卷积不同。我知道带步幅的卷积是如何工作的,但我不熟悉不带步幅的卷积。

给定的卷积函数来自 tflearn,我应该将其设置为零还是其他?

我正在尝试实现我在这里找到的 PilotNet 。

4个回答

步幅是应用卷积核的空间位置之间的距离。默认情况下,每个维度的距离为 1。正如@Axel Vanraes提到的,这也是张量流中的默认值。

我想这有时被称为非跨步卷积,尽管这是不正确的:步幅是一。当步幅大于 1时,人们通常会谈论跨步卷积 以明确区分

可视化差异:

  • Stride-1 卷积(“非跨步”):
  • Stride-2 卷积(“跨步”):

图片来自https://github.com/vdumoulin/conv_arithmetic

总有一大步。卷积的整个想法是你在输入向量、矩阵或张量上跨过窗口。

步幅参数告诉您步幅中的步长。默认情况下,它在任何框架中都可能是 1。您可以增加步幅(步长)以节省空间或缩短计算时间。这样做时您将前面提到一些信息,这是资源消耗(无论是 CPU 还是内存)和检索到的信息之间的权衡。

应用卷积意味着在输入信号上滑动内核,输出加权和,其中权重是内核内部的值。步幅是滑步。步幅不能为 0,这意味着根本不滑动。在论文中,他们使用步长为 2X2 的卷积,x 和 y 方向的步长均为 2,然后是非步长卷积,步长 1,步长 1。您可以从论文的 fig2 中观察到卷积的输出步幅为 2 的输入(前 3 个卷积层)的宽度和高度减半,而步幅为 1 的卷积的输出(后两个卷积层)的宽度 = input_width-2 和高度 = height-2,因为内核是 3x3。

首先,不存在非跨步卷积。使用低级 API,以下语句将给出错误,因为strides参数中的每个元素都必须大于零!

y = tf.nn.conv2d(x, strides=[1, 0, 0, 1]) # error !
y = tf.nn.conv2d(x, strides=[1, 1, 1, 1]) # OK

请注意,第一个(=样本索引)和最后一个(=通道)维度必须等于 1。

其次,当使用TF Layers API时,strides参数有一个默认值:

tf.layers.conv2d(
    inputs,
    filters,
    kernel_size,
    strides=(1, 1), 
    ...

请注意, strides元组中只有两个条目对应于 Layers API 中的第二个和第三个条目。第一个和最后一个维度被删除。

因此,如果您没有设置strides参数,默认情况下卷积过滤器将移动一个像素,我想这就是本文中非跨步卷积的含义。