我正在使用 resnet50 作為編碼器進行影像分割,并在 tensorflow 中使用帶有跳過層的 unpooling 層制作解碼器
這是模型結構,

對于損失函式,我使用了 dice_coefficient 和 IOU 公式,并通過將兩者相加來計算總損失。除了總損失之外,我還添加了來自網路的 REGULARIZATION_LOSSES
total_loss = tf.add_n([dice_coefficient_output IOU_output] tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES))
訓練開始,在第 1 個 epoch,總損失將在 0.4 左右,但是,在第 2 個 epoch,總損失顯示nan為
解碼損失值后,tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)每個層都有值串列,在大多數層中回傳nan。
對于這個挑戰,我嘗試使用不同的歸一化,比如將影像資料縮放到 = 0 到 1、-1 到 1、z 分數,但nan出現在第二個時期。
我試圖降低學習率,改變 中的權重衰減l2 regularization,但從nan第二個 epoch 開始保持不變。
最后,我減少了網路中的神經元,并開始訓練,nan在第 2 個 epoch 消失但在第 4 個 epoch 出現。
任何改進此模型的建議,如何擺脫nan正則化損失
謝謝
uj5u.com熱心網友回復:
兩種可能的解決方案:
- 您可能對輸入資料有疑問。嘗試在輸入資料上呼叫 assert not np.any(np.isnan(x)) 以確保您沒有引入 nan。還要確保所有目標值都有效。最后,確保資料正確標準化。您可能希望像素在 [-1, 1] 而不是 [0, 255] 范圍內,例如:
tf.keras.utils.normalize(data)
與上述相關的其他選項通常是,梯度首先變為 NaN。首先要考慮的兩件事是降低的學習率和可能的梯度裁剪。
或者,您可以先嘗試除以某個常數(可能等于資料的最大值?)這個想法是讓這些值足夠低,以免引起非常大的梯度。
- 標簽必須在損失函式的域中,因此如果使用基于對數的損失函式,所有標簽都必須是非負的。
否則請參閱此鏈接:https ://discuss.pytorch.org/t/getting-nan-after-first-iteration-with-custom-loss/25929/7
了解必須在損失函式域內的標簽的域適應:
https://machinelearningmastery.com/loss-and-loss-functions-for-training-deep-learning-neural-networks/
https://rohitbandaru.github.io/blog/2021/08/09/Domain-Adaptation.html
https://towardsdatascience.com/understanding-domain-adaptation-5baa723ac71f
https://www.v7labs.com/blog/domain-adaptation-guide
https://arxiv.org/pdf/1901.05335.pdf
https://machinelearning.apple.com/research/bridging-the-domain-gap-for-neural-models
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/531234.html
標籤:Pythonpython-3.x张量流喀拉斯卷积神经网络
