conv = conv_2d (strides=)
我想知道非跨步卷积在什么意义上与跨步卷积不同。我知道带步幅的卷积是如何工作的,但我不熟悉不带步幅的卷积。
给定的卷积函数来自 tflearn,我应该将其设置为零还是其他?
我正在尝试实现我在这里找到的 PilotNet 。
conv = conv_2d (strides=)
我想知道非跨步卷积在什么意义上与跨步卷积不同。我知道带步幅的卷积是如何工作的,但我不熟悉不带步幅的卷积。
给定的卷积函数来自 tflearn,我应该将其设置为零还是其他?
我正在尝试实现我在这里找到的 PilotNet 。
步幅是应用卷积核的空间位置之间的距离。默认情况下,每个维度的距离为 1。正如@Axel Vanraes提到的,这也是张量流中的默认值。
我想这有时被称为非跨步卷积,尽管这是不正确的:步幅是一。当步幅大于 1时,人们通常会谈论跨步卷积 以明确区分。
可视化差异:
Stride-2 卷积(“跨步”):
总有一大步。卷积的整个想法是你在输入向量、矩阵或张量上跨过窗口。
步幅参数告诉您步幅中的步长。默认情况下,它在任何框架中都可能是 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参数,默认情况下卷积过滤器将移动一个像素,我想这就是本文中非跨步卷积的含义。