了解来自tf.layers.conv2d的输入/输出张量

时间:2018-05-12 17:29:57

标签: python tensorflow convolutional-neural-network

我正在尝试理解tf.layers.conv2d

执行的转换

TensorFlow网站的mnist教程代码包括卷积层:

# Computes 64 features using a 5x5 filter.
# Padding is added to preserve width and height.
# Input Tensor Shape: [batch_size, 14, 14, 32]
# Output Tensor Shape: [batch_size, 14, 14, 64]
conv2 = tf.layers.conv2d(
    inputs=pool1,
    filters=64,
    kernel_size=[5, 5],
    padding="same",
    activation=tf.nn.relu)

然而我的期望是32个输入图像将乘以滤波器的数量,因为每个滤波器应用于每个图像,以给出[batch_sz,14,14,2048]的输出张量。显然这是错误的,但我不知道为什么。转型如何运作? API文档没有告诉我它是如何工作的。如果输入张量是[batch_size,14,14,48],那么输出会是什么?

非常感谢提前。

2 个答案:

答案 0 :(得分:1)

输出大小取决于输入尺寸,滤镜宽度,填充和步幅。您可以评估conv2(以及任何单个图层),然后打印输出的尺寸以确保它们符合您的想法。您不需要仅在最后一层调用eval,因为tensorflow比这更灵活。

答案 1 :(得分:1)

我认为你可能对过滤器的工作原理有一点误解。 This introductionthis answer提供了一些详细说明。我发现介绍中的Convolution Demo动画非常有助于展示它是如何工作的。

这里的关键点是过滤器的工作原理。通常,卷积层有一组K过滤器(在您的示例中为64)。对于每个过滤器,实际形状为kernel_size + depth_of_input(在您的示例中为5x5x32)。这意味着一个过滤器将同时查看/应用于32个通道/图像,并给出一个结论/ computed_feature。因此,输出的深度/ num_of_features等于filters参数而不是input_depth*filters。请检查this code以了解有关计算的真实和最终内核。

因此,要回答上一个问题,[batch_size, 14, 14, 32][batch_size, 14, 14, 48]的输出将始终为[batch_size, 14, 14, 64]