TF Graph与代码不对应

时间:2018-04-12 13:57:21

标签: python tensorflow machine-learning neural-network tensorboard

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

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

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

我在张量板中获得的图表位于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 个答案:

答案 0 :(得分:0)

张量板中的图形渲染可能有点令人困惑(最初),但它是正确的。看看这张图片,我只留下了图表的inner_layers部分:

tensorboard

您可能会注意到:

  • first_densesecond_dense实际上是名称范围本身(由tf.layers.dense函数生成;另请参阅this question)。
  • 他们的输入/输出张量 位于inner_layers范围内,并正确连接到dropout_layer。在这里,在每个密集图层中,使用相应的线性操作:MatMulBiasAddRelu
  • 两个范围还包括变量(每个kernelbias),它们与inner_layers分开显示。它们封装了与变量相关的操作,例如readassigninitialize等。first_dense中的线性操作依赖于{{1}的变量操作和first_dense同样如此。

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

    话虽如此,我很乐意看到张量流中的模式不会将范围分成变量和操作并保持耦合。

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