池化和卷积运算在输入张量上滑动一个“窗口”。使用
tf.nn.conv2d作为一个例子:如果输入张量有4个方面:
[batch, height, width, channels],则卷积在二维窗口上操作
height, width的尺寸。
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]与
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运算符比较笼统,因此您 可以 创建卷积以使窗口沿其他尺寸滑动,但这在卷积网络中并不常见。典型用途是在空间上使用它们。
为什么要重塑为-1
-1是一个占位符,它表示“根据需要进行调整以匹配整个张量所需的大小”。这是使代码独立于输入批处理大小的一种方法,因此您可以更改管道,而不必在代码中的任何地方调整批处理大小。



