2017-03-31 4 views
1

compute_gradientgrad_and_varタプルを取得した後: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とあなたの変数を圧縮するために、以下のコードのように、zip形式のリストに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) 
関連する問題