从 tf.layers.conv2d 了解输入/输出张量

Posted

技术标签:

【中文标题】从 tf.layers.conv2d 了解输入/输出张量【英文标题】:Understanding input/output tensors from tf.layers.conv2d 【发布时间】:2018-10-22 20:27:38 【问题描述】:

我正在尝试了解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],输出会是什么?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

我认为您可能对过滤器在这里的工作方式有一个小小的误解。 This introduction 和 this answer 提供了一些详细的解释。我发现介绍中的卷积演示动画非常有助于展示它的工作原理。

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

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

【讨论】:

谢谢Y. Luo,这是我怀疑但不确定的。令人讨厌的是 TF 文档没有解释它,至少据我所知。 @tinyMind 欢迎您。有时有关流行算法的详细信息可能在tutorial。

以上是关于从 tf.layers.conv2d 了解输入/输出张量的主要内容,如果未能解决你的问题,请参考以下文章

如何访问 tf.layers.conv2d 中的内核变量?

tensorflow中踩过的坑

tensorflow1.3 API学习笔记 1

在linux下怎样用fread函数从输入端读取数据,输入的数据数不确定,就是从从终端想输多少就读多少那种

Java输入输出

从其他驱动程序获取输入流?图形输入板驱动程序,输出 Midi 以与 Web Midi API 一起使用