5

Tümü,Güncelleştirme sırasında Tensorflow'daki geçişlerde NaN nasıl kontrol edilir?

Büyük miktarda örnek içeren büyük bir model eğitirken, bazı parametreler, parametre güncellemesinde NaN gradyanına neden olabilir.

Ve bu örnekleri bulmak istiyorum. Bu arada modelin parametresini güncellemek için bu parti örneklerinin degrade istemiyorum çünkü modelin parametresinin NaN olması olabilir.

Yani dozun bu problemle başa çıkmak için iyi bir fikri var mı?

Kodum aşağıda gibidir:

# Create an optimizer. 
    params = tf.trainable_variables() 
    opt = tf.train.AdamOptimizer(1e-3) 
    gradients = tf.gradients(self.loss, params) 

    max_gradient_norm = 10 
    clipped_gradients, self.gradient_norms = tf.clip_by_global_norm(gradients, 
                max_gradient_norm) 

    self.optimizer = opt.apply_gradients(zip(clipped_gradients, params)) 

cevap

9

Sen geçişlerini tf.check_numerics tarafından NaN olup olmadığını kontrol edebilirsiniz: clipped_gradients NaN veya sonsuzluk ise

grad_check = tf.check_numerics(clipped_gradients) 
with tf.control_dependencies([grad_check]): 
    self.optimizer = opt.apply_gradients(zip(clipped_gradients, params)) 

grad_checkInvalidArgument atardı.

tf.control_dependencies, degradeleri uygulamadan önce grad_check'un değerlendirildiğinden emin olur.

Ayrıca bkz. tf.add_check_numerics_ops().

+0

Çok teşekkür ederim. Ama yine bir sorum var. Koduma tf.add_check_numerics_ops() eklediğimde, Yetersiz Bellek hatası alıyorum. Ve bu çizgiyi kaldır, her şey yolunda. Modelim gerçekten büyük, tf.add_check_numerics_ops() kontrol işlemleri için daha fazla GPU belleği ayıracaktır? – Issac

+0

"tf.check_numerics" çekirdeğinde bir tensör kopyası var: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/check_numerics_op.cc#L60. Yani sadece tf.check_numerics kullanarak bir çift kontrol ekleyin. Kayan yazılan tüm tensörler için tf.add_check_numerics_ops() 'yi kullanan tf.check_numerics 'i kullanmak isterseniz, ek dikkat etmeniz gerekir. – yuefengz

0

tf.is_nan ile birlikte tf.cond ile birlikte kullanabilirsiniz ve kayıp NaN değilse kodunuzun geri kalanını yürütür.