我想使用AdamOptimizer,但我也希望每一步都能编辑渐变。
典型用法如下:
train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss)
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
sess.run(train_step, feed_dict=feed_dict)
这适用于AdamOptimizer的单个训练步骤。
我想在每一步修改渐变,所以我提取它们并使用以下代码重新插入它们:
opt = tf.train.AdamOptimizer(learning_rate=1e-3)
grads_and_vars = opt.compute_gradients(loss)
train_opt = opt.apply_gradients(grads_and_vars)
sess.run(train_opt, feed_dict=feed_dict)
我通常会对grads_and_vars
应用一些操作,但我只是想让它首先运行。由于以下错误,以前的代码在sess.run(train_opt, feed_dict=feed_dict)
处失败:
FailedPreconditionError (see above for traceback): Attempting to use uninitialized value beta1_power_1
[[Node: beta1_power_1/read = Identity[T=DT_FLOAT, _class=["loc:@Variable"], _device="/job:localhost/replica:0/task:0/cpu:0"](beta1_power_1)]]
由train_opt = opt.apply_gradients(grads_and_vars)
引起,但我没有正确应用渐变吗?
GradientDescentOptimizer 没有错误,因此我知道这必须是提取渐变的正确方法,然后将其重新插入训练步骤。
我有什么遗失的东西吗?我如何以这种方式使用AdamOptimizer?
编辑:我提到第二个代码块与GradientDescentOptimizer一起使用,但它比第一个代码慢大约10倍。有没有办法加快速度?
答案 0 :(得分:1)
运行此sess.run(tf.local_variables_initializer())
,adam中有局部变量,您需要初始化它们