首页 > 解决方案 > 使用自定义 mape 损失时的 keras nan 损失

问题描述

我构建了一个简单的 lstm 网络并使用了 costom mape loss,如下所示:

def custom_mape(y_true, y_pred):
    mapes = K.switch(K.equal(y_true, 0), y_true, 100*K.abs(y_true - y_pred)/y_true)
    return K.mean(mapes, axis=-1)

而损失一开始就变成了nan:

Model: "sequential_93"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_163 (LSTM)              (None, 14, 1)             296       
=================================================================
Total params: 296
Trainable params: 296
Non-trainable params: 0
_________________________________________________________________
Epoch 1/50
410/410 [==============================] - 3s 7ms/step - loss: nan - val_loss: nan
Epoch 2/50
410/410 [==============================] - 2s 6ms/step - loss: nan - val_loss: nan
Epoch 3/50
410/410 [==============================] - 2s 6ms/step - loss: nan - val_loss: nan
Epoch 4/50
410/410 [==============================] - 2s 6ms/step - loss: nan - val_loss: nan
Epoch 5/50
410/410 [==============================] - 2s 6ms/step - loss: nan - val_loss: nan
Epoch 6/50
410/410 [==============================] - 2s 5ms/step - loss: nan - val_loss: nan
Epoch 7/50
410/410 [==============================] - 3s 6ms/step - loss: nan - val_loss: nan
Epoch 8/50
410/410 [==============================] - 2s 5ms/step - loss: nan - val_loss: nan
Epoch 9/50
410/410 [==============================] - 2s 5ms/step - loss: nan - val_loss: nan
Epoch 10/50
410/410 [==============================] - 2s 5ms/step - loss: nan - val_loss: nan

以下是我尝试的一些方法:

  1. 当我将 K.abs(y_true - y_pred)/y_true 更改为 K.abs(y_true - y_pred) 时,网络正常工作。
  2. 为了判断是不是梯度爆炸,我分别尝试了clipvalue=1、lr=0和batchsize=1。损失仍然是nan。

此外,我对 y 使用了 min-max 归一化,y 的样本如下:

[[1.84368752e-05],
[9.86574098e-04],
[8.09853832e-04]]

标签: pythontensorflowkeras

解决方案


K.abs(y_true - y_pred)/y_true

在这里, if y_trueis 0,你会得到 nan 因为你试图除以0


推荐阅读