当前位置:  开发笔记 > 编程语言 > 正文

Tensorflow Strides Argument

如何解决《TensorflowStridesArgument》经验,为你挑选了3个好方法。

我想了解的进步在tf.nn.avg_pool,tf.nn.max_pool,tf.nn.conv2d说法.

该文件反复说

strides:长度> = 4的整数列表.输入张量的每个维度的滑动窗口的步幅.

我的问题是:

    4+整数中的每一个代表什么?

    为什么他们必须有步幅[0] =步幅[3] = 1?

    在这个例子中我们看到tf.reshape(_X,shape=[-1, 28, 28, 1]).为什么-1?

遗憾的是,使用-1重新整形的文档中的示例并不能很好地转换为这种情况.



1> dga..:

池化和卷积操作在输入张量上滑动"窗口".使用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 ...
...

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

卷积的输入有shape=[1, 32, 32, 1].

如果指定strides=[1,1,1,1]with padding=SAME,则过滤器的输出将为[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]

第一个是批处理:您通常不想跳过批处理中的示例,或者您不应该首先包含它们.:)

最后一个是卷积的深度:出于同样的原因,您通常不想跳过输入.

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

为什么重新形成-1 -1是一个占位符,表示"根据需要调整以匹配完整张量所需的大小".这是一种使代码与输入批量大小无关的方法,因此您可以更改管道,而无需在代码中的任何位置调整批处理大小.


@derek因为(来自文本)"我们将给卷积输出通道深度为8".设置卷积时你可以选择它,而回答者选择了8.

2> Rafał Józefo..:

输入是4维的并且具有以下形式: [batch_size, image_rows, image_cols, number_of_colors]

通常,跨步定义了应用操作之间的重叠.在conv2d的情况下,它指定卷积滤波器的连续应用之间的距离.特定维度中的值1表示我们在每行/列应用运算符,值2表示每秒,依此类推.

Re 1)卷积的重要值是第2和第3,它们表示卷积滤波器沿行和列应用的重叠.[1,2,2,1]的值表示我们希望在每个第二行和每列上应用过滤器.

Re 2)我不知道技术限制(可能是CuDNN要求),但通常人们沿着行或列维度使用步幅.在批量大小上执行它不一定有意义.不确定最后一个维度.

Re 3)为其中一个维度设置-1表示"设置第一个维度的值,以使张量中的元素总数不变".在我们的例子中,-1将等于batch_size.



3> Salvador Dal..:

让我们从1-dim案例中的步幅开始吧.

让我们假设您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个结果来对1-strided卷积的结果进行下采样.

知道输入大小i,内核大小k,步幅s和填充p,您可以轻松地计算卷积的输出大小:

在此输入图像描述

在这里|| 操作员指天花板操作.对于池化层s = 1.


N-dim案例.

知道1-dim情况的数学,一旦你看到每个昏暗是独立的,n-dim情况就很容易.因此,您只需单独滑动每个维度.这是2-d的示例.请注意,您不需要在所有维度上具有相同的步幅.因此,对于N-dim输入/内核,您应该提供N步.


所以现在很容易回答你的所有问题:

    4+整数中的每一个代表什么?.conv2d,pool告诉您此列表表示每个维度之间的步幅.请注意,步幅列表的长度与内核张量的等级相同.

    为什么他们必须有步幅[0] =步幅3 = 1?.第一个维度是批量大小,最后一个维度是通道.没有必要跳过批次或渠道.所以你制作它们1.对于宽度/高度,你可以跳过一些东西,这就是为什么它们可能不是1.

    tf.reshape(_X,shape = [ - 1,28,28,1]).为什么-1? tf.reshape为您提供:

    如果形状的一个组件是特殊值-1,则计算该维度的大小,以使总大小保持不变.特别地,[-1]的形状变平为1-D.最多一个形状的组件可以是-1.

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有