2017-03-31 76 views
1

得到grad_and_var元组compute_gradient后:如何在tensorflow-r1.0中修剪grad_and_var元组的梯度范数?

opt = tf.train.RMSPropOptimizer(learning_rate) 
grad_and_var = opt.compute_gradients(losses, params) 

我想剪辑grad_and_var。但是,当我做的:

clipped_gradients, _ = tf.clip_by_global_norm(grad_and_var, max_gradient_norm) 

直接,所产生的clipped_gradients是张名单,这意味着,梯度和变数一直连接在一起。

如果我做

clipped_gradients = [tf.clip_by_global_norm(x[0], max_gradient_norm)[0] for x in grad_and_var] 

我得到了这样的错误:

TypeError: t_list should be a sequence 

你有什么想法,我该如何解决?非常感谢!

回答

3

,我已经看到了一种可能的方法来压缩clipped_gradients和你的变量,以及压缩的名单上使用opt.apply_gradients,如下面的代码(从here采取行78-83):

tvars = tf.trainable_variables() 
grads, _ = tf.clip_by_global_norm(tf.gradients(self.cost, tvars), 
       args.grad_clip) 
with tf.name_scope('optimizer'): 
    optimizer = tf.train.AdamOptimizer(self.lr) 
self.train_op = optimizer.apply_gradients(zip(grads, tvars)) 
2

您可以剪裁标准并添加像这样的梯度噪音:

opt = tf.train.AdamOptimizer(learning_rate=self.config.learning_rate) 
gvs = opt.compute_gradients(self.loss) 
gvs = [(tf.clip_by_norm(grad,self.config.max_grad), val) for grad,val in gvs] 
gvs = [(tf.add(grad, tf.random_normal(tf.shape(grad),stddev=self.config.grad_noise)), val) for grad,val in gvs] 
self.train_op = opt.apply_gradients(gvs)