Tensorflow步幅参数

我想了解tf.nn.avg_pool,tf.nn.max_pool,tf.nn.conv2d中的strides参数。

文件反复说

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

我的问题是:

  1. 每个4+整数代表什么?
  2. 为什么他们必须步伐[0] =步伐[3] = 1的衔接点?
  3. 在这个例子中,我们看到tf.reshape(_X,shape=[-1, 28, 28, 1]) 。 为什么是-1?

可悲的是,使用-1重塑的文档中的示例并不能很好地转换成这种情况。

汇集和卷积运算在input张量上滑动一个“窗口”。 以tf.nn.conv2d为例:如果input张量有4个维度: [batch, height, width, channels] ,则卷积运算在height, width尺寸的2D窗口上。

strides决定了窗口在每个维度上的移动量。 典型用途将第一批(批次)和最后(深度)步幅设置为1。

让我们使用一个非常具体的例子:在32×32灰度input图像上运行2-d卷积。 我说灰度,因为那么input图像的depth = 1,这有助于保持简单。 让图像看起来像这样:

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

让我们通过一个例子(批量大小= 1)运行一个2×2卷积窗口。 我们将卷积输出通道深度为8。

卷积的inputshape=[1, 32, 32, 1] 1,32,32,1 shape=[1, 32, 32, 1]

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

filter将首先创build一个输出:

 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]

第一个是批处理:你通常不想跳过批处理的例子,或者你不应该把它们包括在第一位。 🙂

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

conv2d操作符更为通用,因此您可以创build将窗口沿着其他维度滑动的卷积,但这并不是典型的使用方式。 典型的用途是在空间上使用它们。

为什么重塑到-1 -1是一个占位符,它说:“根据需要进行调整以匹配满张量所需的大小”。 这是使代码独立于input批处理大小的一种方法,这样您就可以更改stream水线,而无需在代码中随处调整批处理大小。

input是4维的,格式为:[batch_size,image_rows,image_cols,number_of_colors]

通常跨越界定应用操作之间的重叠。 在conv2d的情况下,它指定了卷积滤波器连续应用之间的距离。 特定维度中的值1意味着我们在每行/列上应用操作符,值为2意味着每秒钟,等等。

Re 1)对于卷积来说重要的值是第二和第三,它们表示卷积滤波器沿行和列的应用的重叠。 [1,2,2,1]的值表示我们希望在每隔一行和一列应用滤镜。

重新2)我不知道技术限制(可能是CuDNN的要求),但通常人们沿行或列的尺寸使用大步。 批量大小并不一定有意义。 不知道最后的维度。

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

让我们从1-dim案例的步骤开始吧。

我们假设你的input = [1, 0, 2, 3, 0, 1, 1] 1,0,2,3,0,1,1 input = [1, 0, 2, 3, 0, 1, 1]kernel = [2, 1, 3] 2,1,3 kernel = [2, 1, 3]卷积的结果是[8, 11, 7, 9, 4] 8,11,7,9,4 [8, 11, 7, 9, 4] ,这是通过在input上滑动内核来计算,执行元素乘法和求和。 像这样 :

  • 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

在这里,我们通过一个元素滑动,但是没有任何东西通过使用任何其他数字来阻止 这个数字是你的大步。 你可以把它看作是对每个第一个结果进行1步卷积的结果下采样。

知道input大小i ,内核大小k ,跨度和填充p ,可以很容易地计算卷积的输出大小为:

在这里输入图像说明

这里|| 操作员是指天花板操作 对于一个池层s = 1。


N-dim案件。

知道一个1-dim情况下的math,一旦你看到每个dim都是独立的,那么n-dim情况就很容易了。 所以你只需要单独滑动每个维度。 这是一个2-D的例子 。 注意,你不需要在所有的维度上都有相同的步幅。 所以对于一个N-diminput/内核,你应该提供N个步幅。


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

  1. 每个4+整数代表什么? 。 conv2d , pool告诉你这个列表代表了每个维度中的步幅。 请注意,步幅列表的长度与核张量的秩相同。
  2. 为什么他们必须有步幅[0] =步幅3 = 1的方式? 。 第一个维度是批量大小,最后是渠道。 跳过批次和频道都没有意义。 所以你让他们1.宽度/高度,你可以跳过的东西,这就是为什么他们可能不是1。
  3. tf.reshape(_X,shape = [ – 1,28,28,1])。 为什么是-1? tf.reshape为您覆盖:

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

Interesting Posts