python - 使用自定义 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
以下是我尝试的一些方法:
- 当我将 K.abs(y_true - y_pred)/y_true 更改为 K.abs(y_true - y_pred) 时,网络正常工作。
- 为了判断是不是梯度爆炸,我分别尝试了clipvalue=1、lr=0和batchsize=1。损失仍然是nan。
此外,我对 y 使用了 min-max 归一化,y 的样本如下:
[[1.84368752e-05],
[9.86574098e-04],
[8.09853832e-04]]
解决方案
K.abs(y_true - y_pred)/y_true
在这里, if y_true
is 0
,你会得到 nan 因为你试图除以0
。
推荐阅读
- php - Codeigniter foreach() 限制
- .net-core - 如何关闭 Application Insights Dependency Tracker?
- ios - bcsymbolmap 不是有效的标识符?
- javascript - 如何在 FeatherJS 中验证日期格式
- python - 使用pyqt5 mvc进行窗口切换
- sql-server - 使用 SSAS 多维多维数据集的 Power BI Slow
- swift - 由于“内部”保护级别,“值”不可访问
- vue.js - v-alert 显示多行文本?
- marklogic - Marklogic json:config 生成“_children”
- jquery - 附加文本并使用淡入淡出添加类