Sub*_*rat 3 regression lstm keras rnn
我有一个带有双向 LSTMS 的 CNN-RNN 模型架构,用于时间序列回归问题。我的损失没有收敛超过 50 个时期。每个 epoch 有 20k 个样本。损失在0.001 - 0.01之间不断反弹。
batch_size=1
epochs = 50
model.compile(loss='mean_squared_error', optimizer='adam')
trainingHistory=model.fit(trainX,trainY,epochs=epochs,batch_size=batch_size,shuffle=False)
Run Code Online (Sandbox Code Playgroud)
模型 :
model = Sequential()
model.add(LSTM(units=128, dropout=0.05, recurrent_dropout=0.35, return_sequences=True, batch_input_shape=(batch_size,featureSteps,input_dim)))
model.add(LSTM(units=32, dropout=0.05, recurrent_dropout=0.35, return_sequences=False))
model.add(Dense(units=2, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)
如果你测试过:
那么你的模型实际上可以学习一些东西。
有一些可能性:
情况1:
确保您Y
在上次激活函数的范围内。
tanh
(LSTM 的默认值),所有 Y 数据应介于 -1 和 + 1 之间 sigmoid
,介于 0 和 1 之间 softmax
,介于 0 和 1 之间,但请确保您的最后一个维度不是 1,否则所有结果始终为 1。 relu
,介于 0 和无穷大之间 linear
,任何值如果你有一个有限的激活而不是一个无限大的激活,收敛会更好。
在第一种情况下,您可以重新编译(在训练后)具有较低学习率的模型,通常我们将其除以 10,其中默认值为0.0001
:
案例2:
如果数据正常,请在模型停滞后尝试降低学习率。
adam 的默认学习率为0.0001
,我们通常将其除以 10:
from keras.optimizers import Adam
#after training enough with the default value:
model.compile(loss='mse', optimizer=Adam(lr=0.00001)
trainingHistory2 = model.fit(.........)
#you can even do this again if you notice that the loss decreased and stopped again:
model.compile(loss='mse',optimizer=Adam(lr=0.000001)
Run Code Online (Sandbox Code Playgroud)
如果问题出在学习率上,这将使您的模型学习到比之前更多的东西(在优化器自行调整之前可能会在开始时遇到一些困难)。
案例3:
如果你没有成功,也许是时候增加模型的能力了。可能向层添加更多单元,添加更多层甚至更改模型。
案例4:
你可能对此无能为力......
但是,如果您像情况 3 那样增加模型,请注意过度拟合(保留一些测试数据以比较测试损失与训练损失)。
太好的模型只会记住你的数据,而不是学习关于它的重要见解。
归档时间: |
|
查看次数: |
1331 次 |
最近记录: |