张量流跨步论证

我试图理解 tf.nn.avg _ pool、 tf.nn.max _ pool、 tf.nn.inv2d 中的 大步流星参数。

文件反复说

Strids: 长度 > = 4的 int 列表。每个输入张量尺寸的滑动窗口的步长。

我的问题是:

  1. 每个4 + 整数代表什么?
  2. 为什么女修道院必须大步流星[0] = 大步流星[3] = 1?
  3. this example中我们看到 tf.reshape(_X,shape=[-1, 28, 28, 1])。为什么是 -1?

遗憾的是,文档中使用 -1重塑形状的例子并没有很好地解释这种情况。

47292 次浏览

输入是四维的,形式为: [batch_size, image_rows, image_cols, number_of_colors]

一般而言,跨距定义了应用操作之间的重叠。在 conv2d 的情况下,它指定了卷积滤波器的连续应用之间的距离。特定维度中的值1意味着我们在每一行/每一秒应用操作符,值2意味着每一秒,依此类推。

Re 1) The values that matter for convolutions are 2nd and 3rd and they represent the overlap in the application of the convolutional filters along rows and columns. The value of [1, 2, 2, 1] says that we want to apply the filters on every second row and column.

Re 2) I don't know the technical limitations (might be CuDNN requirement) but typically people use strides along the rows or columns dimensions. It doesn't necessarily make sense to do it over batch size. Not sure of the 最后一维。

Re 3) 设置 -1为其中一个维,意思是“设置第一个维的值,使张量中的元素总数保持不变”。在我们的示例中,-1将等于 batch _ size。

池操作和卷积操作在输入张量上滑动一个“窗口”。以 tf.nn.conv2d为例: 如果输入张量有4个维度: [batch, height, width, channels],则卷积操作在 height, width维度上的2D 窗口上。

strides确定窗口在每个尺寸中移动的幅度。典型的用法将第一步(批处理)和最后一步(深度)设置为1。

让我们使用一个非常具体的例子: 在32x32的灰度输入图像上运行2-d 卷积。我之所以说是灰度,是因为这样输入的图像深度 = 1,这有助于保持图像的简单性。让这个图像看起来像这样:

00 01 02 03 04 ...
10 11 12 13 14 ...
20 21 22 23 24 ...
30 31 32 33 34 ...
...

让我们在一个示例上运行一个2x2卷积窗口(批量大小 = 1)。我们将给卷积一个输出通道深度为8。

The input to the convolution has shape=[1, 32, 32, 1].

如果用 padding=SAME指定 strides=[1,1,1,1],那么过滤器的输出将是[1,32,32,8]。

过滤器将首先为以下内容创建一个输出:

F(00 01
10 11)

然后是:

F(01 02
11 12)

然后移动到第二行,计算:

F(10, 11
20, 21)

那么

F(11, 12
21, 22)

如果你指定一个步长为[1,2,2,1] ,它不会做重叠窗口,它会计算:

F(00, 01
10, 11)

然后

F(02, 03
12, 13)

对于池运算符,步长的操作方式类似。

问题2: 为什么跨越[1,x,y,1]对于女修道院

第一个是批处理: 您通常不希望跳过批处理中的示例,或者您一开始就不应该包含它们。:)

最后1是卷积的深度: 出于同样的原因,您通常不希望跳过输入。

Conv2d 操作符更通用,因此 可以创建卷积,使窗口沿其他维度滑动,但这不是在 convnet 中的典型用法。典型的用途是在空间上使用它们。

为什么重塑为 -1 -1是一个占位符,表示“根据需要进行调整,以匹配完整张量所需的大小。”这是一种使代码独立于输入批量大小的方法,这样您就可以更改您的管道,而不必在代码的任何地方调整批量大小。

让我们从1-dim 情况下的 stride 做什么开始。

让我们假设 input = [1, 0, 2, 3, 0, 1, 1]kernel = [2, 1, 3]的卷积结果是 [8, 11, 7, 9, 4],它是通过在输入上滑动内核、执行元素乘法和求和来计算的。返回文章页面

  • 8 = 1 * 2 + 0 * 1 + 2 * 3
  • 11 = 0 * 2 + 2 * 1 + 3 * 3
  • 7 = 2 * 2 + 3 * 1 + 0 * 3
  • 9 = 3 * 2 + 0 * 1 + 1 * 3
  • 4 = 0 * 2 + 1 * 1 + 1 * 3

在这里我们滑动一个元素,但没有什么阻止您使用任何其他数字。这个数字代表你的步伐。你可以把它看作是对单步卷积的结果进行下采样只取每个 s 次结果。

Knowing the input size , kernel size K, stride <是的trong>是的 and padding P you can easily calculate the output size of the convolution as:

enter image description here

Here || operator means ceiling operation. For a pooling layer s = 1.


N-dim 箱子。

了解了1-dim 情形的数学运算,一旦看到每个 dim 都是独立的,n-dim 情形就很容易了。你只需要分别滑动每个维度。这是 2-d 的例子。请注意,您不需要在所有维度上具有相同的步长。因此,对于 N-dim 输入/内核,您应该提供 N 个步长。


因此,现在很容易回答你的所有问题:

  1. 每个4 + 整数代表什么?.翻译游泳池告诉您,这个列表表示每个维度之间的步骤。请注意,大步列表的长度与核张量的秩相同。
  2. 为什么女修道院必须有大跨度[0] = 大跨度 3 = 1?.第一个尺寸是批量大小,最后一个尺寸是通道。没有跳过任何一批或通道的意义。所以你把它们变成1。对于宽度/高度,你可以跳过某些内容,这就是为什么它们可能不是1。
  3. 重塑(_ X,形状 = [-1,28,28,1])为什么是 -1:

    如果形状的一个组成部分是特殊值 -1,则计算该维度的大小,以使总大小保持不变。特别是[-1]的形状会变成一维。形状的最多一个分量可以是 -1。

@ dga 的解释工作做得非常出色,我对它的帮助感激不尽。以同样的方式,我想分享我对 stride如何在3D 卷积中工作的发现。

根据 conv3d 上的 TensorFlow 文档,输入的形状必须按以下顺序排列:

[batch, in_depth, in_height, in_width, in_channels]

让我们用一个例子来解释从最右边到最左边的变量 input_shape = [1000,16,112,112,3]

input_shape[4] is the number of colour channels (RGB or whichever format it is extracted in)
input_shape[3] is the width of the image
input_shape[2] is the height of the image
input_shape[1] is the number of frames that have been lumped into 1 complete data
input_shape[0] is the number of lumped frames of images we have.

下面是如何使用跨步的摘要文档。

大步: 长度 > = 5.1-D 张量为5的 int 的列表。 每个输入维度的滑动窗口的步长。必须 有 strides[0] = strides[4] = 1

正如在许多作品中指出的那样,步长仅仅意味着一个窗口或内核离最近的元素有多少步远,无论是数据帧还是像素(顺便解释一下)。

From the above documentation, a stride in 3D will look like this strides = (1,X,为什么,Z,1).

The documentation emphasizes that strides[0] = strides[4] = 1.

strides[0]=1 means that we do not want to skip any data in the batch
strides[4]=1 means that we do not want to skip in the channel

跨步[ X ]意味着我们应该在集中的框架中跳跃多少次。例如,如果我们有16帧,X = 1意味着使用每一帧。X = 2意味着使用每一个第二帧,并继续下去

大步[ y ]和大步[ z ]跟随 @ dga的解释,所以我不会重做那部分。

In keras however, you only need to specify a tuple/list of 3 integers, specifying the strides of the convolution along each spatial dimension, where spatial dimension is stride[x], strides[y] and strides[z]. strides[0] and strides[4] is already defaulted to 1.

我希望有人觉得这有帮助!