为什么使用2x2滤波器对5x5图像进行卷积会在TF MNIST中产生32个特征?

Kas*_*v92 1 tensorflow

我不明白为什么在官方文档中使用2x2滤镜的5x5补丁的卷积产生32个特征......

卷积每次移动1,所以它应该产生6*6 = 36个特征,而不是32个.有什么东西我不见了吗?

nes*_*uno 6

32是一个超参数:一旦定义了网络,就可以选择从输入中提取的特征数量.

输入为28x28x1时,您可以选择学习32个卷积滤波器.学习的卷积滤波器提取单个特征.

W_conv1 = weight_variable([5, 5, 1, 32])
Run Code Online (Sandbox Code Playgroud)

...是一组32个过滤器的定义,每个过滤器大小为5x5x1,网络将在训练阶段后学习.

您可以更改要学习的卷积滤波器的数量,因为它是一个超参数,所以它完全是任意的.

例如,您可以选择从第一个卷积层中提取64个要素,方法是更改​​上一行,如下所示:

W_conv1 = weight_variable([5, 5, 1, 64])
b_conv1 = bias_variable([64]) #change biases as well
Run Code Online (Sandbox Code Playgroud)

但是您必须在下一层中跟踪此更改.

在本教程中,您将找到另一组卷积过滤器的定义:

W_conv2 = weight_variable([5, 5, 32, 64])
Run Code Online (Sandbox Code Playgroud)

这是一组64个卷积滤波器的定义,每个滤波器的大小为5x5x32.

如果更改第一个图层以提取64个要素,则必须相应地更改此图层:

    W_conv2 = weight_variable([5, 5, 64, 64])
Run Code Online (Sandbox Code Playgroud)

这意味着64个提取的特征中的每一个都与另外64个特征相结合:抽象增加.

第一层提取简单的特征(边,线,......),其他层组合提取的特征以形成更复杂的特征.

卷积每次移动1,因此它应该产生6*6 = 36个特征,而不是32.

"shift"(称为stride S)是执行2d卷积时要跳转的像素数.

如果输入的边长为28像素,则带有(第5组)滤波器的卷积输出为 (28 - 5 + 2P)/S=1 + 1 = 24

由于卷积op具有填充参数= SAME,因此P计算值以便产生与输入具有相同大小的输出,因此28.

你的6*6没有任何意义.

长话短说:

不要将提取的特征数(超参数)与激活图的大小混淆.激活映射是输入和学习的卷积滤波器(也称为内核)之间的卷积的结果.