我有一个CNN-RNN模型架构,双向LSTMS用于时间序列回归问题。我的损失并没有超过50个时代。每个时代都有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)
型号:
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'])
答案 0 :(得分:3)
如果您测试过:
然后你的模型实际上可以学习一些东西。
那里有一些可能性:
案例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)
如果问题是学习率,这将使您的模型比现在学习更多(开始时可能会有一些困难,直到优化器调整自己)。
案例3:
如果你没有成功,也许是时候增加模型的能力了。 可能会在图层中添加更多单位,添加更多图层甚至更改模型。
案例4:
你可能无能为力......
但是,如果您像案例3那样增加模型,请小心过度拟合(保留一些测试数据以比较测试损失与训练损失)。
太好的模型可以简单地记住您的数据,而不是学习有关它的重要见解。