楠训练模型时具有RMSE / RMSLE损失功能

时间:2017-05-13 09:36:44

标签: python neural-network keras nan loss-function

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

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经常出现在中间,仅在最后一个时期出现一些折叠(总计发生在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

感谢您的想法,我感谢您的一切帮助!

1 个答案:

答案 0 :(得分: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)))