第一种可以进行梯度裁剪使用apply_gradients操作
con.set_model(models.TransE)
#Now we apply gradient clipping. For this, we need to get the gradients,
#use the `clip_by_value()` function to clip them, then apply them:
threshold = 1.0
self.model = model
self.trainModel = self.model(config = self)
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
grads_and_vars = optimizer.compute_gradients(self.trainModel.loss)
#list包括的是:梯度和更新变量的元组对
capped_gvs = [(tf.clip_by_value(grad, -threshold, threshold), var)
for grad, var in grads_and_vars]
#执行对应变量的更新梯度操作
training_op = optimizer.apply_gradients(capped_gvs)
第二种直接使用minimize
调用minimize的时候是干了两件时间,compute_gradients
和apply_gradients
,这样写更为方便,但是如果要进行梯度的裁剪,梯度的选择就要写成上面的形式。
self.optimizer = tf.train.AdagradOptimizer(self.params.learning_rate).minimize(self.loss)`
_, err = self.sess.run([self.optimizer, self.loss], feed_dict={self.ph: ph, self.pt: pt, self.nh: nh, self.nt: nt, self.r: r})