Optimization 由于预测值非常大,RNN损失变为NaN

Optimization 由于预测值非常大,RNN损失变为NaN,optimization,neural-network,deep-learning,keras,recurrent-neural-network,Optimization,Neural Network,Deep Learning,Keras,Recurrent Neural Network,下面是我使用Keras构建的RNN: def RNN_keras(feat_num, timestep_num=100): model = Sequential() model.add(BatchNormalization(input_shape=(timestep_num, feat_num))) model.add(LSTM(input_shape=(timestep_num, feat_num), output_dim=512, activation='relu',

下面是我使用Keras构建的RNN:

def RNN_keras(feat_num, timestep_num=100):
    model = Sequential()
    model.add(BatchNormalization(input_shape=(timestep_num, feat_num)))
    model.add(LSTM(input_shape=(timestep_num, feat_num), output_dim=512, activation='relu', return_sequences=True))
    model.add(BatchNormalization())  
    model.add(LSTM(output_dim=128, activation='relu', return_sequences=True))
    model.add(BatchNormalization())
    model.add(TimeDistributed(Dense(output_dim=1, activation='linear'))) # sequence labeling

    rmsprop = RMSprop(lr=0.00001, rho=0.9, epsilon=1e-08)
    model.compile(loss='mean_squared_error',
                  optimizer=rmsprop,
                  metrics=['mean_squared_error'])
    return model
输出如下:

61267 in the training set
6808 in the test set

Building training input vectors ...
888 unique feature names
The length of each vector will be 888
Using TensorFlow backend.

Build model...

****** Iterating over each batch of the training data ******
# Each batch has 1280 examples
# The training data are shuffled at the beginning of each epoch.
Epoch 1/3 : Batch 1/48 | loss = 607.043823 | root_mean_squared_error = 24.638334
Epoch 1/3 : Batch 2/48 | loss = 14479824582732.208323 | root_mean_squared_error = 3805236.468701
Epoch 1/3 : Batch 3/48 | loss = nan | root_mean_squared_error = nan
Epoch 1/3 : Batch 4/48 | loss = nan | root_mean_squared_error = nan
Epoch 1/3 : Batch 5/48 | loss = nan | root_mean_squared_error = nan
......
第二批中的损失非常高,然后变为nan。真正的结果y不包含非常大的值。最大y小于400

另一方面,我检查预测输出y_hat。RNN返回一些非常高的预测,这将导致无穷大

然而,我仍然对如何改进我的模型感到困惑。

问题是通过1)将输出层的激活从“线性”更改为“relu”和/或2)降低学习速率来“某种程度上”解决

然而,现在的预测都是零。

问题是通过1)将输出层的激活从“线性”更改为“relu”和/或2)降低学习速率来“某种程度上”解决的


然而,现在的预测都是零。

你是否尝试过切换到交叉熵损失?你是否尝试使用
tanh
sigmoid
而不是
relu
来避免大值?@Julius这是一个回归问题。交叉熵损失也适用吗?@S.Mohsensh我试过tanh。问题仍然存在。我只是试着在输出层用relu替换线性。它是有效的,但损失不会随着时间的推移而减少。所有历元都有相同的损失。您是否尝试过切换到交叉熵损失?您是否尝试使用
tanh
sigmoid
而不是
relu
来避免较大的值?@Julius这是一个回归问题。交叉熵损失也适用吗?@S.Mohsensh我试过tanh。问题仍然存在。我只是试着在输出层用relu替换线性。它是有效的,但损失不会随着时间的推移而减少。所有历元具有相同的损耗。relu设计用于输出稀疏向量。它在输出层中既不用于分类(因为它不输出概率),也不用于回归(因为由于设计,大多数输出为零)。对于最后一层,保持最后一层线性是一个很好的选择。RELU设计用于输出稀疏向量。它在输出层中既不用于分类(因为它不输出概率),也不用于回归(因为由于设计,大多数输出为零)。对于最后一层,保持最后一层线性是一个很好的选择