【问题标题】:Tensorflow: Why Doesn't Out of Graph Cost Calculation WorkTensorflow:为什么不进行图外成本计算
【发布时间】:2016-10-05 23:25:24
【问题描述】:

我有一个如下所示的标准实验循环:

cross_entropy_target = tf.reduce_mean(tf.reduce_mean(tf.square(target_pred - target)))
cost = cross_entropy_target
opt_target = tf.train.AdamOptimizer(learning_rate=0.00001).minimize(cost)
for epoch in range(num_epochs):
    for mini_batch in range(num_samples / batch_size):
        mb_train_x, mb_train_target = get_mini_batch_stuffs()
        sess.run(opt_target, feed_dict={x: mb_train_x, target: mb_train_target})

这运行并收敛到良好的预测损失。现在,相同的代码稍作修改:

cross_entropy_target = tf.reduce_mean(tf.reduce_mean(tf.square(target_pred - target)))
cross_entropy_target_variable = tf.Variable(0.0)
cost = cross_entropy_target_variable
opt_target = tf.train.AdamOptimizer(learning_rate=0.00001).minimize(cost)
for epoch in range(num_epochs):
    for mini_batch in range(num_samples / batch_size):
        mb_train_x, mb_train_target = get_mini_batch_stuffs()
        new_target_cost = sess.run(cross_entropy_target, feed_dict={x: mb_train_x, time: mb_train_time, target: mb_train_target})
        sess.run(tf.assign(cross_entropy_target_variable, new_target_cost))
        sess.run(opt_target, feed_dict={x: mb_train_x, target: mb_train_target})

现在,我不是将 cross_entropy_target 计算为 opt_target 图表的一部分,而是预先计算它,将其分配给 tensorflow 变量,并期望它使用该值。这根本行不通。网络的输出永远不会改变。

我希望这两个代码 sn-ps 具有相同的结果。在这两种情况下,前馈用于填充targettarget_pred 的值,然后将其减少为标量值cross_entropy_target。此标量值用于告知优化器的.minimize() 上梯度更新的幅度和方向。

在这个玩具示例中,我计算 cross_entropy_target “图外”然后将其分配给图内 tf.Variable 以在 opt_target 运行中使用没有任何优势。但是,我有一个真实的用例,其中我的成本函数非常复杂,我无法根据 Tensorflow 现有的张量变换来定义它。无论哪种方式,我都想了解为什么使用tf.Variable 作为优化器的成本是不正确的使用。

一个有趣的奇怪现象可能是解决此问题的副产品: 如果我设置cross_entropy_target_variable = tf.Variable(0.0, trainable=False),运行opt_target 会崩溃。它要求成本值是可修改的。事实上,在运行 opt_target 之前和之后打印出它的值会产生不同的值:

cross_entropy_target before = 0.345796853304 cross_entropy_target after = 0.344796866179

为什么运行minimize()会修改成本变量的值?

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    在您的tf.train.AdamOptimizer( 行中,它查看cost,这是cross_entropy_target,这是一个tf.Variable 操作,并创建一个什么都不做的优化器,因为cross_entropy_target 不依赖于任何变量.稍后修改cross_entropy目标没有效果,因为优化器已经创建好了。

    【讨论】:

    • 很有道理,谢谢。我的命令式思维方式与 tensorflow 基于图形的方法发生冲突。我想知道我是否可以通过输入成本值的占位符来实现我的目标。否则我可能不得不放弃并在 C++ 中实现一些自定义操作,这无论如何都是正确且有效的方法。
    • 顺便说一句,我制作了一个包装器,可以让您以命令式方式使用 TensorFlow -- github.com/yaroslavvb/imperative
    • 不幸的是,使用占位符作为成本值会导致与使用不可训练变量作为成本值相同的崩溃。我将努力阅读minimize() 代码以了解原因。您的命令式 tensorflow 非常酷,我会试一试!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    相关资源
    最近更新 更多