从 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 了解输入/输出张量的主要内容,如果未能解决你的问题,请参考以下文章