Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Tensorboard中的mnist示例中生成了意外的层_Python_Tensorflow_Deep Learning_Conv Neural Network_Tensorboard - Fatal编程技术网

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

Python 在Tensorboard中的mnist示例中生成了意外的层,python,tensorflow,deep-learning,conv-neural-network,tensorboard,Python,Tensorflow,Deep Learning,Conv Neural Network,Tensorboard,为了学习tensorflow,我执行了tensorflow官方mnist脚本()并用tensorboard显示了图形 以下是代码的一部分。 该网络包含两个conv层和两个密集层 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=co

为了学习tensorflow,我执行了tensorflow官方mnist脚本()并用tensorboard显示了图形

以下是代码的一部分。 该网络包含两个conv层和两个密集层

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生成的图来看,有三个conv层和三个稠密层。 我没想到会生成
conv2d\u 1
densed\u 1

为什么会生成
conv2d\u 1
densite\u 1


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

这是一个好问题,因为它为
tf.layers
wrappers的内部结构提供了一些信息。让我们进行两个实验:

  • 完全按照问题中的方式运行模型
  • 通过
    name
    参数向层添加显式名称,然后再次运行
没有图层名称的图形 这是与您的相同的图形,但我扩展并放大了logits密集层。请注意,
densite_1
包含层变量(内核和偏差),而
densite_2
包含ops(矩阵乘法和加法)

这意味着这仍然是一层,但是有两个命名范围。之所以会出现这种情况,是因为这是第二个密集层,而第一个密集层已经使用了命名范围
dense
。变量的创建与实际的层逻辑是分开的-有
build
call
方法,-它们都试图为作用域获得一个唯一的名称。这导致
densite_1
densite_2
分别持有变量和ops

指定名称的图形 现在,让我们将
name='logits'
添加到同一层并再次运行:

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

您可以看到仍然有2个变量和2个操作,但是层设法为作用域获取一个唯一的名称(
logits
),并将所有内容放在其中

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