【发布时间】: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 具有相同的结果。在这两种情况下,前馈用于填充target 和target_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