我想了解的进步在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重新整形的文档中的示例并不能很好地转换为这种情况.
池化和卷积操作在输入张量上滑动"窗口".使用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是一个占位符,表示"根据需要调整以匹配完整张量所需的大小".这是一种使代码与输入批量大小无关的方法,因此您可以更改管道,而无需在代码中的任何位置调整批处理大小.
输入是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.
让我们假设您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.
知道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.