池化和卷积运算在输入张量上滑动一个“窗口”。以tf.nn.conv2d
为例:如果输入张量具有4个维度: [batch, height, width, channels]
,则卷积将在2D窗口上对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]
1、32、32、1 shape=[1, 32, 32, 1]
。
如果您使用padding=SAME
指定strides=[1,1,1,1]
,则过滤器的输出将为strides=[1,1,1,1]
]。
过滤器将首先为以下内容创建输出:
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是一个占位符,表示“根据需要进行调整以匹配整个张量所需的大小”。这是使代码独立于输入批处理大小的一种方法,因此您可以更改管道,而不必在代码中的任何地方调整批处理大小。
0
我想了解tf.nn.avg_pool,tf.nn.max_pool,tf.nn.conv2d 长足进步的论点。
该文件反复说
我的问题是:
tf.reshape(_X,shape=[-1, 28, 28, 1])
。为什么是-1?遗憾的是,文档中使用-1进行重塑的示例并不能很好地解释这种情况。