Tensorflow: 图构建依赖于评估

我正在编写以下格式的tensorflow图:

def process_label(label):    return some_operation(label.eval())Input: X, Labeloutput,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的值。如果我在这里尝试使用output.eval(session),它将不起作用,因为我的会话将执行整个图,因此我只能在最后调用它。

我想知道是否有办法将这个图分成两部分,同时仍然让梯度下降通过网络工作,或者是否有其他方法可以做到这一点。


回答:

这些方法可能存在缺陷,但这里有两个起始的想法:1)简单 vs. 2)高效:

1)将所有内容放在一个图中,就好像你已经有了想要的标签。执行一次以获取输出(只需提供计算输出的必要占位符,tensorflow不会要求标签占位符)。然后运行训练操作,提供标签占位符以及再次提供计算输出的必要占位符。它将重新运行所有操作来计算“outputs”,所以效率不高。

2)使用两个独立的图(可能也需要两个会话?)。在图1中计算输出以及输出相对于可训练变量的梯度(tf.gradients),按需计算你的标签,在图2中计算损失相对于输出的梯度(tf.gradients)(输出在图2中是一个占位符),乘以梯度以获取损失相对于变量的梯度,并在图1中使用optizer.apply_gradients()。

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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注