我知道已经有很多人问过类似的问题,如果它适用于我的情况,我尝试了那里提到的所有内容,但没有任何帮助。回归训练模型如下:
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
,每个子集(甚至每两列组合)都会发生这种情况。我还改变了neurons
, the dropout
, the optimizer
(to 'adam'
) 和batch_size
.
感谢您的想法,感谢您的每一个帮助!