2016-11-25 239 views
4

我正在使用tf.nn.sigmoid_cross_entropy_with_logits函數來計算損失,它將返回到NaN。Tensorflow損失去NaN

我已經在使用漸變剪裁,張量分割被執行的一個地方,我已經添加了一個epsilon以防止被零除,並且所有softmax函數的參數也有一個添加到它們的epsilon。

但是,我通過培訓獲得了NaN的中途。

是否有任何已知的問題,張量流這樣做,我錯過了? 這很令人沮喪,因爲在訓練過程中損失會隨機進入NaN並毀掉一切。

另外,我怎麼可能去檢測火車的步驟是否會導致NaN,並可能完全跳過這個例子?有什麼建議麼?

編輯:網絡是一個神經圖靈機。

編輯2:我已經上傳了一些代碼here。 它沒有評論,並且對那些已經閱讀Graves等人的NTM論文的人來說是最有意義的。可在這裏:https://arxiv.org/abs/1410.5401

我不確定我的所有代碼是否完全遵循本文作者的意圖。我只是這樣做的做法,我沒有導師來糾正我。

編輯3:下面是梯度裁剪代碼:

optimizer = tf.train.AdamOptimizer(self.lr) 
gvs = optimizer.compute_gradients(loss) 
capped_gvs =\ 
    [(tf.clip_by_value(grad, -1.0, 1.0), var) if grad != None else (grad, var) for grad, var in gvs] 
train_step = optimizer.apply_gradients(capped_gvs) 

我不得不添加if grad != None條件,因爲我得到了一個錯誤,沒有它。問題能在這裏嗎?

潛在的解決方案:我使用tf.contrib.losses.sigmoid_cross_entropy有一段時間了,到目前爲止的損失並沒有分歧。將測試更多並報告回來。

+2

作爲第一個想法,請嘗試降低學習率。 – sygi

+0

我使用Adam優化器進行漸變裁剪,因此不確定改變學習速度有多大幫助。我確實嘗試降低了學習速度,但仍然使用了NaN。事實上,在降低比率之前,它完成了沒有任何問題的訓練,我認爲我已經以某種方式解決了這個問題 - 但不是。 – SilverSlash

+0

您是否曾嘗試在每層之前添加非常小的高斯噪聲? – broncoAbierto

回答

0

使用1e-4作爲學習率。 Adam似乎總是用Adam優化器爲我工作。即使你漸變剪輯,它仍然可以發散。另一個偷偷摸摸的方法是取平方根,因爲雖然它對於所有正輸入都是穩定的,但它的梯度隨着值接近零而發散。最後,我會檢查並確保模型的所有輸入都是合理的。

+0

圖中確實存在平方根計算,但平方根計算爲張量的l2範數的一部分。因此,我在使用tf.square()之前先考慮它們的平方根,甚至在平方之後我已經添加了一個epsilon以避免被零除。 – SilverSlash

+0

嘗試使用tf.nn.l2_loss函數。無關緊要的是你在sqrt之前放了一些東西。它仍然會分歧。訓練一段時間後,你只會發散,因爲那時誤差很小,sqrt的差異就會發散。 – chasep255

+0

不能使用tf.nn.l2_loss,因爲它不會使用暗淡的參數。它總結張量的每個元素,我需要做一個特定的維度。 – SilverSlash