2016-08-04 44 views
1

爲了降低張量,我定義的所有dytpe=tf.float16變量在我的模型,然後定義優化:does 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) 

一切正常,OK!但是在我運行train_adam_op之後,漸變和變量在python中是nan。我漫步如果apply_gradients() API支持tf.float16類型?爲什麼我得到nan後apply_gradients()session.run()調用....

+0

執行'apply_gradients'操作後,'loss'變成了''nan'在Python中。所以我懷疑tensorflow的'apply_gradients' API是否支持tf.float16? –

回答

4

與32位浮點數相比,fp16的動態範圍相當有限。因此,它們很容易上溢或下溢,這往往會導致你遇到的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()以及各種分類原語,所以我會開始在那裏尋找。

一旦找出哪個操作序列有問題,可以使用tf.cast()將序列的輸入轉換爲32位浮點數來更新模型以使用32位浮點數執行該序列,並且將結果轉換回fp16。

+0

非常感謝你!我會試一試。 –

+0

我添加了'tf.check_numerics()'檢查模型定義中的一些操作,但是現在我得到了'LookupError:沒有爲操作'training/loss/CheckNumerics'(op類型:CheckNumerics)'錯誤定義的漸變。如何避免這個錯誤?請給我一些建議 –

+0

非常感謝。我已經解決了這個問題。對'apply_gradients()'API使用'epsilon'參數。 –