Tensorflow:依赖于评估的图形构建

时间:2016-07-25 18:08:03

标签: machine-learning tensorflow deep-learning

我正在编写以下格式的张量流图:

def process_label(label):
    return some_operation(label.eval())

Input: X, Label
output,state = NN_Layers()
processed_output = process_data(output)
processed_label = process_label(processed_output, Label)
loss = cross_entropy(processed_output, processed_label)
optimize = GradientDescentOptimizer.minimize(loss)

Session.run(optimize, feed_dict{X:input, Label:label})

这个模型的问题是我需要输出值才能按照我想要的方式处理我的标签,这样我就可以计算损失。如果我在这里尝试使用output.eval(session),它将无法工作,因为我的会话将执行整个图形,因此我只能在最后调用它。

我想知道s a way I can break this graph apart in two and still have the gradient descent work through the network, or if there是否还有其他办法可以做到这一点。

2 个答案:

答案 0 :(得分:1)

您可以使用py_func将任何计算包装为tensorflow操作。这在分布式设置中效果不佳,但它允许您将任意计算放入张量流图中。

除非您在process_*函数中执行非常复杂的操作,否则应该在tensorflow操作中编写它们。大部分时间比你想象的要容易。如果缺少特定功能,请提交功能请求。

答案 1 :(得分:0)

这些可能存在缺陷,但这里有两个想法:1)轻松与高效:

1)将它们全部放在一个图表中,就好像你有你想要的标签一样。执行一次以获得输出(仅提供输出所需的占位符,tensorflow将不需要标签占位符)。然后运行训练操作,为标签占位符和输出所需的占位符提供信息。它将重新运行所有操作来计算“输出”,因此效率不高。

2)使用两个单独的图表(也可能需要两个会话?)。根据图1中的可训练变量(tf.gradients)计算输出和输出的梯度,根据需要计算标签,计算相对于图2中输出的损失梯度(tf.gradients)(输出为图2)中的占位符,乘以渐变以获得相对于变量的损失梯度,以及图1中的optizer.apply_gradients()。

编辑:实际上,您可以在选项2中使用一个图形。当您计算d_loss / d_output时,可以直接将输出反馈到输出张量,快捷操作以计算输出。即feed_dict不限于占位符。