TF Graph与代码不对应

Posted

技术标签:

【中文标题】TF Graph与代码不对应【英文标题】:TF Graph does not correspond to the code 【发布时间】:2018-09-22 17:21:56 【问题描述】:

我正在尝试创建一个非常简单的神经网络来读取形状为1x2048 的信息,并为两个类别(对象或非对象)创建分类。然而,图形结构偏离了我认为已经编码的内容。密集层应该包含在“inner_layer”的范围内,并且应该从“input”占位符接收它们的输入。相反,TF 似乎将它们视为不从“输入”接收任何信息的独立层。

此外,在尝试使用张量板摘要时,我收到一个错误消息,告诉我我没有提到为密集层的明显占位符插入输入。当省略张量板时,一切都按照我的预期工作,基于代码。

我花了很多时间试图找到问题,但我认为我一定忽略了一些非常基本的东西。

我在张量板上得到的图表在this image。

对应如下代码:

tf.reset_default_graph()
keep_prob = 0.5

# Graph Strcuture
## Placeholders for input
with tf.name_scope('input'):
    x_ = tf.placeholder(tf.float32, shape = [None, transfer_values_train.shape[1]], name = "input1")
    y_ = tf.placeholder(tf.float32, shape = [None, num_classes], name = "labels")

## Dense Layer one with 2048 nodes
with tf.name_scope('inner_layers'):
    first_layer = tf.layers.dense(x_, units = 2048, activation=tf.nn.relu, name = "first_dense")
    dropout_layer = tf.nn.dropout(first_layer, keep_prob, name = "dropout_layer")
    #readout layer, without softmax
    y_conv = tf.layers.dense(dropout_layer, units = 2, activation=tf.nn.relu, name = "second_dense")

# Evaluation and training
with tf.name_scope('cross_entropy'):
    cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels = y_ , logits = y_conv),
                                   name = "cross_entropy_layer")
with tf.name_scope('trainer'):
    train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

with tf.name_scope('accuracy'):
    prediction = tf.argmax(y_conv, axis = 1)
    correct_prediction = tf.equal(prediction, tf.argmax(y_, axis = 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

有谁知道为什么图表与您根据代码所期望的如此不同?

【问题讨论】:

【参考方案1】:

tensorboard 中的图形渲染可能有点混乱(最初),但它是正确的。看看这张图片,我只留下了你图表的inner_layers 部分:

您可能会注意到:

first_densesecond_dense 实际上是名称范围本身(由tf.layers.dense 函数生成;另请参见this question)。 它们的输入/输出张量inner_layers 范围内,并正确连接到dropout_layer。在这里,在每个密集层中,都有相应的线性操作:MatMulBiasAddRelu

两个范围还包括 变量kernelbias 各),它们与 inner_layers 分开显示。它们封装了专门与变量相关的ops,如readassigninitialize等。first_dense中的线性ops依赖于first_dense的变量ops,second_dense同样如此。

这种分离的原因是,在distributed settings 中,变量由名为参数服务器 的不同任务管理。它通常在不同的设备上运行(CPU 而不是 GPU),有时甚至在不同的机器上。换句话说,对于 tensorflow,变量管理的设计不同于矩阵计算。

话虽如此,我很想在 tensorflow 中看到一种模式,它不会将作用域拆分为变量和操作并保持它们耦合。

除此之外,图表与代码完全匹配。

【讨论】:

以上是关于TF Graph与代码不对应的主要内容,如果未能解决你的问题,请参考以下文章

机器学习与Tensorflow——tf.train.Saver()inception-v3的应用

graph

Tensorflow(tf.Graph)和(tf.session)

如何在Tensorflow中使用自定义/非默认tf.Graph正确的方法?

4TensorFlow基础常用API与变量作用域

AttributeError: 'Tensor' 对象没有属性'_in_graph_mode'。