2016-08-04 1 views
1

, 내 모델에 dytpe=tf.float16 모든 변수를 정의하고 최적화 정의 :tensorflow 0.10.0rc 버전은 float16을 지원합니까? 텐서를 줄이기 위해

optimizer = tf.train.AdamOptimizer(self.learning_rate) 
self.compute_gradients = optimizer.compute_gradients(self.mean_loss_reg) 
train_adam_op = optimizer.apply_gradients(self.compute_gradients, global_step=self.global_step) 

모든 것이 작품을 좋아! 그러나 train_adam_op을 실행 한 후에는 그라디언트와 변수가 파이썬에서 사용됩니다. 방황했습니다 apply_gradients() API가 tf.float16 유형을 지원하는 경우? apply_gradients()session.run() ...

+0

'apply_gradients' 연산이 실행 된 후,'loss'는 파이썬에서'nan'이되었습니다. 그래서 tensorflow의'apply_gradients' API가 tf.float16을 지원하는지 의심 스럽습니다. –

답변

4

에 의해 호출 된 후 나는 왜 나노를 얻었 는가? fp16의 동적 범위는 32 비트 부동 소수점에 비해 상당히 제한적입니다. 결과적으로 오버 플로우 또는 언더 플로우가 발생하기 쉽습니다. 종종 NaN이 발생합니다.

모델에 몇 가지 check_numerics 연산을 삽입하여 fp16에서 수행 할 때 불안정한 특정 연산을 정확하게 찾을 수 있습니다. FP16에 그 결과가 맞는지 확인하기 위해 수행으로

예를 들어, L2 손실 작업을 마무리 할 수 ​​

A = tf.l2_loss(some_tensor)

오버 플로우의

A = tf.check_numerics(tf.l2_loss(some_tensor), "found the root cause")

가장 일반적인 소스가 언더 플로우는 exp(), log(), 다양한 분류 프리미티브이기 때문에 거기서부터 살펴볼 것입니다.

문제가되는 작업 순서를 파악한 후에는 시퀀스의 입력을 32 비트 부동 소수점으로 변환하기 위해 tf.cast()를 사용하여 32 비트 부동 소수점을 사용하여 해당 시퀀스를 수행하도록 모델을 업데이트 할 수 있습니다. 결과를 fp16으로 다시 캐스트하십시오.

+0

대단히 감사합니다! 나는 시험해 볼게. –

+0

내 모델 정의에서'tf.check_numerics()'일부 작업을 확인했지만 'LookupError : 작업'training/loss/CheckNumerics (op type : CheckNumerics) '오류에 대해 정의 된 그라데이션이 없습니다.'오류가 발생합니다. 이 오류를 방지하는 방법? 제게 약간의 충고를 해주시겠습니까 –

+0

고맙습니다. 문제를 해결했습니다. 'apply_gradients()'API에'epsilon' 매개 변수를 사용합니다. –

관련 문제