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

标签 python tensorflow deep-learning conv-neural-network tensorboard

为了学习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

mnist graph picture generated by tensorboard

最佳答案

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

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

没有图层名称的图

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

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

graph-1

指定名称的图

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

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

graph-2

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

结论

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

关于python - 在 Tensorboard 的 mnist 示例中生成了意外层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48545477/

相关文章:

python - keras 自定义损失 - 忽略零标签

tensorflow - Tensorflow模型的超参数调优|隐藏层大小和隐藏层数量

Python错误: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\cl.exe' failed with exit status 4

python - TensorFlow:将 float64 张量转换为 float32

python - 如何在网络路径上正确使用 os.listdir?

machine-learning - 我可以在 2 个不同的 GPU 上同时训练 2 个不同的神经网络吗?

python - Keras LSTM 尝试创建模型架构时出现多个错误

tensorflow - MXNet 与其他深度学习 API 相比的优缺点

javascript - 带有类别的 Django 选项字段

python - 在 Python 中注释代码的正确方法是什么?