张量流中的自定义参数更新无效

时间:2017-12-21 21:26:09

标签: tensorflow gradients

我无法实现下面定义的自己的参数更新。我正在努力为卷积神经网络做这个,当我使用AdamOptimizer时它可以工作。 尽管损失发生变化,但显示重量和偏差值的直方图显示迭代没有变化。提前谢谢。

def gradient_upgrade(gradients, base_rate, rate_multiplier):

    with tf.name_scope('gradient-update'):
        for i in range(len(weights)):
            weights[i].assign(tf.subtract(weights[i], tf.multiply(gradients[i], base_rate * rate_multiplier)))
            biases[i].assign(tf.subtract(biases[i], tf.multiply(gradients[len(weights)+i], base_rate * rate_multiplier)))

    return weights, biases

gradient = tf.gradients(cost, [*weights, *biases])

我稍后在feed_dict = minibatch

上调用sess.run
sess.run(gradient_upgrade(gradient, .001, 1), feed_dict = feed_dict)

权重和偏差分别为以下形式

tf.Variable(tf.truncated_normal(shape, stddev=0.05))
tf.Variable(tf.constant(0.05, shape=[length]))

1 个答案:

答案 0 :(得分:0)

似乎正在发生的事情是您的分配操作未执行。在你的电话中

gradient_update

调用assign只会创建不执行它们的gradient_update操作。由于sess.run()的返回值是权重和偏差,sess.run()执行图表的一部分来获取这些变量,这只是意味着读取它们的当前值。

要执行分配操作,您有几个选项。首先,您可以保存创建的assign ops并将它们显式传递给with tf.control_dependencies()。另一种选择是使用update_op。您可以搜索更多examples,但基本上,它允许您在操作之间添加依赖关系。换句话说,你可以在执行任何操作[a,b,c,...]之前告诉tensorflow"你需要执行[x,y,z,...]中的所有操作&# 34 ;.使用它,您可以创建Estimators创建的sess.run(update_op)之类的内容。此更新操作将取决于您的所有分配操作。每当你运行# Create and put all of your assign ops in some list # assign_ops_list.append(weights[i].assign(....))) with tf.control_dependencies(assign_ops_list): train_op = ... # Some operations that should trigger assignments sess.run(train_op) # all assign ops will now run. 时,tensorflow都会执行所有的操作。

伪代码看起来像这样:

{{1}}
相关问题