我在想怎么用stop_gradient在TensorFlow中,我要将单词嵌入到CBOWword2vec模型,现在用stop_gradient生成损失函数w.r.t.的梯度,我只想得到值,而不是反向传播。
目前,我使用的代码:
lossGrad = gradients.gradients(loss, embed)[0]
real_grad = lossGrad.eval(feed_dict)现在有点晚了但我是这样解决的。我只想对一些变量进行优化,而不是对所有变量进行优化。我认为防止优化某些变量的方法是使用stop_grad-但我从来没有找到办法让它发挥作用.。也许有办法,但对我有效的是调整我的optimizer仅对变量列表进行优化。因此,与其:
opt = tf.train.GradientDescentOptimizer(learning_rate=eta)
train_op = opt.minimize(loss)我用:
opt = tf.train.GradientDescentOptimizer(learning_rate=eta)
train_op = opt.minimize(loss, var_list=[variables to optimize over])这防止了opt中未更新的变量。var_list希望它对你也有用!
发布于 2018-01-17 16:26:40
tf.gradients(loss, embed)计算张量的偏导数loss关于张量embedTensorFlow通过反向传播来计算这个偏导数,因此评估tf.gradients(...)执行反向传播。但是,计算该张量并不执行任何变量更新。
tf.stop_gradient()是一种运算,它充当正向的恒等函数,但阻止累积的梯度沿反方向流过该算子。它并不完全阻止反向传播,而是阻止单个张量对为表达式计算的梯度作出贡献。
发布于 2018-01-17 17:26:44
import tensorflow as tf
import numpy as np
w1 = tf.get_variable("w1", shape=[5, 1], initializer=tf.truncated_normal_initializer())
w2 = tf.get_variable("w2", shape=[5, 1], initializer=tf.truncated_normal_initializer())
w3 = tf.get_variable("w3", shape=[5, 1], initializer=tf.truncated_normal_initializer())
x = tf.placeholder(tf.float32, shape=[None, 5], name="x")
a1 = tf.matmul(x, w1)
a2 = tf.matmul(x, w2*w3)
a2 = tf.stop_gradient(a2)
loss = tf.reduce_mean(tf.square(a1 - a2))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
gradients = optimizer.compute_gradients(loss)
train_op = optimizer.apply_gradients(gradients)https://stackoverflow.com/questions/-100007157
复制相似问题