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_dense
和second_dense
实际上是名称范围本身(由tf.layers.dense
函数生成;另请参见this question)。
它们的输入/输出张量在inner_layers
范围内,并正确连接到dropout_layer
。在这里,在每个密集层中,都有相应的线性操作:MatMul
、BiasAdd
、Relu
。
两个范围还包括 变量(kernel
和 bias
各),它们与 inner_layers
分开显示。它们封装了专门与变量相关的ops,如read
、assign
、initialize
等。first_dense
中的线性ops依赖于first_dense
的变量ops,second_dense
同样如此。
这种分离的原因是,在distributed settings 中,变量由名为参数服务器 的不同任务管理。它通常在不同的设备上运行(CPU 而不是 GPU),有时甚至在不同的机器上。换句话说,对于 tensorflow,变量管理的设计不同于矩阵计算。
话虽如此,我很想在 tensorflow 中看到一种模式,它不会将作用域拆分为变量和操作并保持它们耦合。
除此之外,图表与代码完全匹配。
【讨论】:
以上是关于TF Graph与代码不对应的主要内容,如果未能解决你的问题,请参考以下文章
机器学习与Tensorflow——tf.train.Saver()inception-v3的应用
Tensorflow(tf.Graph)和(tf.session)