weixin_58911104 2025-01-15 10:33 采纳率: 50%
浏览 81

lstm loss值小,拟合效果差

python 做lstm loss值很小了,但拟合值和真实值相差很大,预测值是条直线,怎么调参啊?
下面是一些代码参数,调停、正则化、学习率、epoch都调过了,怎么修改能改变下预测效果啊?

def buildmylstm(initactivation="relu", ininlr=0.001):
    model = Sequential()
    nb_time_steps=train_x.shape[1]
    nb_input_vector=train_x.shape[2
    # 添加LSTM层
    model.add(Bidirectional(LSTM(units=64, input_shape=(nb_time_steps,nb_input_vector), 
                                 kernel_regularizer=keras.regularizers.l2(0.05),activation=initactivation)))
     # 添加BN层
    model.add(BatchNormalization())
    model.add(Dropout(0.01))
    # 添加全连接层
    model.add(Dense(units=1))
    
    # 编译模型
    lr=ininlr
    adam= optimizers.adam_v2.Adam(learning_rate=lr)
    def scheduler(epoch):##编写学习率变化函数
        ##每隔epoch,学习率减小为原来的1/10
        if epoch % 80==0 and  epoch !=0:
            lr=K.get_value(model.optimizer.lr)
            K.set_value(model.optimizer.lr,lr*0.01)
            print("lr changed to {}".format(lr*0.01))
        return K.get_value(model.optimizer.lr)
    model.compile(loss="mse",optimizer=adam,metrics=["mse"],run_eagerly=True)
    ##根据损失函数性质。回归建模一般选用“距离误差”作为损失函数,分类一般选“交叉熵”损失函数
     # 添加早停法回调
    early_stopping = EarlyStopping(monitor='val_loss', patience=15, verbose=1, mode='min')
    reduce_lr=LearningRateScheduler(scheduler)
    batchsize=int(len(all_data)/10)
    epochs=max(80,batchsize*3)
    history = model.fit(train_x,train_y, epochs=epochs,validation_data=(test_x, test_y), shuffle=False)
    plt.plot(history.history['loss'])
    plt.plot(history.history['val_loss'])
    plt.title('model train vs validation loss')
    plt.ylabel('loss')
    plt.xlabel('epoch')
    plt.legend(['train', 'validation'], loc='upper right')
    plt.show()
     # 在测试时去除dropout层的权重
    def set_dropout_trainable(layer, state):
        layer.trainable = state
    model.layers[-2].trainable = False  # 
设置Dropout层为不可训练
    return model

img

img

  • 写回答

2条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2025-01-15 10:46
    关注
    让【道友老李】来帮你解答,本回答参考gpt编写,并整理提供,如果还有疑问可以点击头像关注私信或评论(小黑屋了,无法评论,请私信)。
    如果答案让您满意,请采纳、关注,非常感谢!
    在你提供的代码中,可以尝试以下几种方法来改善模型的预测效果:
    1. 调整模型架构:尝试增加更多的LSTM层或者调整LSTM层的units参数,以增强模型学习能力。你可以尝试添加更多的LSTM层,并增加units参数的数量,可能会提升模型的表现。
    model.add(Bidirectional(LSTM(units=128, input_shape=(nb_time_steps, nb_input_vector), kernel_regularizer=keras.regularizers.l2(0.05), activation=initactivation)))
    
    1. 调整学习率:尝试不同的学习率,可能当前的学习率不太适合你的数据集,导致模型收敛速度过快或者过慢。可以尝试增大学习率或者减小学习率来看看效果。
    lr = ininlr * 0.1
    adam = optimizers.adam_v2.Adam(learning_rate=lr)
    
    1. 使用更复杂的正则化方法:除了L2正则化之外,可以尝试使用L1正则化或者Dropout等方法来避免过拟合,可能会对模型的泛化能力有帮助。
    model.add(Dropout(0.2))
    
    1. 增加更多的训练数据:如果可能的话,可以尝试增加更多的训练数据,以提高模型的泛化能力。 请注意,调参是一个反复试验的过程,不能保证一次修改就能解决问题。建议对每一种调参方法逐一尝试,结合实际效果来进行调整。
    评论

报告相同问题?

问题事件

  • 创建了问题 1月15日