Tensorboard 的 mnist 示例中生成了意外的层

Posted

技术标签:

【中文标题】Tensorboard 的 mnist 示例中生成了意外的层【英文标题】:Unexpected layers were generated in the mnist example in Tensorboard 【发布时间】:2018-07-10 18:12:21 【问题描述】:

为了学习tensorflow,我执行了这个tensorflow官方mnist脚本(cnn_mnist.py),并用tensorboard展示了图表。

以下是部分代码。 该网络包含两个卷积层和两个密集层。

conv1 = tf.layers.conv2d(inputs=input_layer,filters=32,kernel_size=[5, 5],
      padding="same",activation=tf.nn.relu)

pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)

conv2 = tf.layers.conv2d(inputs=pool1,filters=64,kernel_size=[5, 5],
      padding="same",activation=tf.nn.relu)

pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)

pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 64])

dense = tf.layers.dense(inputs=pool2_flat, units=1024, activation=tf.nn.relu)

dropout = tf.layers.dropout(
      inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN)

logits = tf.layers.dense(inputs=dropout, units=10)

但是看tensorboard生成的图,有3个conv层和3个dense层。 没想到会生成conv2d_1dense_1

为什么会生成conv2d_1dense_1

【问题讨论】:

【参考方案1】:

这是一个很好的问题,因为它揭示了tf.layers 包装器的内部结构。让我们进行两个实验:

完全按照问题中的方式运行模型。 通过name 参数向层添加显式名称并再次运行。

没有图层名称的图表

这与您的图表相同,但我扩展并放大了 logits 密集层。请注意,dense_1 包含层变量(内核和偏差),dense_2 包含操作(矩阵乘法和加法)。

这意味着这仍然是一层,但有两个命名范围 - dense_1dense_2。发生这种情况是因为这是第二个密集层,而第一个密集层已经使用了命名范围 dense。变量的创建与实际的层逻辑是分开的——有buildcall 方法——它们都试图为范围获取一个唯一的名称。这导致dense_1dense_2 分别持有变量和操作。

指定名称的图表

现在让我们将name='logits' 添加到同一层并再次运行:

logits = tf.layers.dense(inputs=dropout, units=10, name='logits')

您可以看到仍然有 2 个变量和 2 个操作,但该层设法为范围获取了一个唯一名称 (logits) 并将所有内容放入其中。

结论

这是一个很好的例子,为什么在 tensorflow 中显式命名是有益的,无论是直接的张量还是更高级别的层。当模型使用有意义的名称而不是自动生成的名称时,混淆会少得多。

【讨论】:

【参考方案2】:

它们只是在tf.layers.conv2d 中发生的变量创建和其他隐藏操作,而不仅仅是卷积操作本身 (tf.nn.conv2d) 和激活(密集层也是如此)。只有 2 个卷积发生:如您所见,如果您在图中跟踪数据,它永远不会通过 conv2D_1dense_1,只是这些操作的结果(基本上是卷积所需的变量)也作为卷积运算本身的输入。我实际上更惊讶的是没有看到 conv_2d 出现相同的东西,但我真的不会为此担心!

【讨论】:

以上是关于Tensorboard 的 mnist 示例中生成了意外的层的主要内容,如果未能解决你的问题,请参考以下文章

mnist识别手写数字以及tensorboard可视化

TensorFlow:tensorboard网络结构

吴裕雄--天生自然深度学习TensorBoard可视化:projector_MNIST

TensorFlow:tensorboard可视化

TensorFlow 2.0 Keras:如何为TensorBoard编写图像摘要

pytorch实战学习第七篇:tensorboard可视化介绍