Nan在使用RMSE/RMSLE损失函数训练模型时

Posted

技术标签:

【中文标题】Nan在使用RMSE/RMSLE损失函数训练模型时【英文标题】:Nan when training model wit RMSE/ RMSLE loss function 【发布时间】:2017-10-12 14:08:53 【问题描述】:

我知道已经有很多人问过类似的问题,如果它适用于我的情况,我尝试了那里提到的所有内容,但没有任何帮助。回归训练模型如下:

from keras.models import Sequential
from keras.layers.core import Dense , Dropout
from keras import backend as K

model = Sequential()
model.add(Dense(units = 128, kernel_initializer = "uniform", activation = "relu", input_dim = 28))
model.add(Dropout(rate = 0.2))
model.add(Dense(units = 128, kernel_initializer = "uniform", activation = "relu"))
model.add(Dropout(rate = 0.2))
model.add(Dense(units = 1, kernel_initializer = "uniform", activation = "relu"))
model.compile(optimizer = "rmsprop", loss = root_mean_squared_logarithmic_error)

model.fit(train_set, labels, batch_size = 32, epochs = 30)

下面定义的损失函数导致:

Epoch 12/30
27423/27423 [==============================] - 2s - loss: 0.4143     
Epoch 13/30
27423/27423 [==============================] - 1s - loss: 0.4070     
Epoch 14/30
27423/27423 [==============================] - 1s - loss: nan 

如果我使用标准的mean_squared_error 损失函数loss = nan 不会发生。如果使用以下两个自定义 loss functions 中的任何一个(当然,这些是我想要运行的)loss = nan 会在某个时候发生。

def root_mean_squared_error(y_true, y_pred):
        return K.sqrt(K.mean(K.square(y_pred - y_true), axis=-1))

def root_mean_squared_logarithmic_error(y_true, y_pred):
    y_pred_log = K.log(K.clip(y_pred, K.epsilon(), None) + 1.)
    y_true_log = K.log(K.clip(y_true, K.epsilon(), None) + 1.)
    return K.sqrt(K.mean(K.square(y_pred_log - y_true_log), axis = -1))

使用root_mean_squared_logarithmic_error 损失函数进行 10 折交叉验证,loss = nan 经常出现在中间,仅在最后一个 epoch 出现某些折叠(总共出现 5 次)。在一个折中,损失收敛到15.6132,并在所有剩余的时期都保持在那里。 4 折完成,没有出现loss = nan

已针对nans 和异常值更正输入数据。我尝试了几种不同的缩放方法,都没有效果

from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import Normalizer

我还改变了输入数据(使用数据子集进行测试),在这种情况下,loss = nan 出现在每个子集中(甚至每两列组合)。我还改变了neuronsdropoutoptimizer(到'adam')和batch_size

感谢您的想法,感谢您的每一个帮助!

【问题讨论】:

您好,我遇到了同样的问题...您碰巧解决了吗?如果是这样,您能否发布您的解决方案@dennis?谢谢! 很遗憾没有,我仍在努力避免 nans 没有任何结果... 如果您找到了解决方案,请发布 :) 我遇到了完全相同的问题,不知道如何解决 【参考方案1】:

abs() 添加到损失函数帮助我解决了这个问题。

def root_mean_squared_error(y_true, y_pred):
        return np.abs(K.sqrt(K.mean(K.square(y_pred - y_true), axis=-1)))

【讨论】:

【参考方案2】:

使用 Evgeniy 的相同代码,将 np.abs 更改为 K.abs:

def root_mean_squared_error(y_true, y_pred):
    return K.abs(K.sqrt(K.mean(K.square(y_pred - y_true), axis=-1)))

【讨论】:

以上是关于Nan在使用RMSE/RMSLE损失函数训练模型时的主要内容,如果未能解决你的问题,请参考以下文章

从表格数据训练深度学习模型时,损失总是 nan

来自 Keras 序列模型训练的 Nan 损失

keras训练cnn模型时loss为nan

微调 HuggingFace NLI 模型(RoBERTa/BART)时,损失为“nan”

Keras 在训练分类 LSTM 序列到序列模型时给出 nan

训练CNN模型图像分类期间的tensorflow NaN损失