Violetttte 2024-04-20 19:39 采纳率: 82.8%
浏览 73

LSTM训练模型,预测结果一直为一条水平直线,完全没有幅度

Model模型的代码如下:

class Net(nn.Module):
    def __init__(self,input_size,hidden_size,num_layers,output_size,batch_size,seq_length) -> None:
        super(Net,self).__init__()
        self.input_size=input_size
        self.hidden_size=hidden_size
        self.num_layers=num_layers
        self.output_size=output_size
        self.batch_size=batch_size
        self.seq_length=seq_length
        self.num_directions=1 # 单向LSTM

        self.liner1 = nn.Linear(input_size, hidden_size)
        self.relu = nn.ReLU()
        self.liner2 = nn.Linear(num_layers*hidden_size, output_size)
        self.dropout = nn.Dropout(0.2)

        self.lstm=nn.LSTM(input_size=hidden_size,hidden_size=hidden_size,num_layers=num_layers,batch_first=True,dropout=0.2) # LSTM层
        self.fc=nn.Linear(hidden_size,output_size) # 全连接层

    def forward(self,x):
        batchsize = x.shape[0]
        x = self.liner1(x)
        x = self.relu(x)

        h_0 = torch.randn(self.num_directions * self.num_layers, x.size(0), self.hidden_size).to('cuda')
        c_0 = torch.randn(self.num_directions * self.num_layers, x.size(0), self.hidden_size).to('cuda')

        output, (h_n, c_n) = self.lstm(x, (h_0, c_0)) # output(5, 30, 64)

        output = h_n.permute(1,0,2).reshape(batchsize, -1) # 64,10,32  -> 64,32*2
        pred = self.dropout(output)
        pred = self.liner2(pred)     

        pred = pred[:, -1]      # 修改后的预测 因为在前面reshape了

        return pred

配置的代码如下:

    # 参数设置
    seq_length = 10  # 时间步长
    input_size = 3  # 原本为3,现在为5, 删去postcode与time
    num_layers = 2 # 4
    hidden_size = 128 # 512??
    batch_size = 64
    n_iters = 10000 # 50000 5000
    lr = 0.0001
    output_size = 1
    split_ratio = 0.9
    path = 'data/raw_sales.csv'
    moudle = Net(input_size, hidden_size, num_layers, output_size, batch_size, seq_length)
    criterion = torch.nn.MSELoss()
    optimizer = torch.optim.Adam(moudle.parameters(), lr=lr)
    scaler = MinMaxScaler()

跑出来的一个结果图是这样的:

img

不管怎么跑都是一条直线,简直晕了!

  • 写回答

4条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-04-20 19:39
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题描述:对于给定的数据集,使用一个LSTM模型进行时间序列预测,但是在多次尝试之后,得到的结果总是一条直线,无法正确预测。 解决方案:针对这个问题,建议从以下几个方面进行排查和改进:
    1. 数据预处理:检查数据是否合理、是否存在异常值、是否需要进行归一化、是否需要进行平滑处理等等。特别是在做时间序列预测时,数据的平稳性和稳定性对模型的预测结果至关重要。
    2. 模型结构、参数:检查模型是否选择合适,是否需要进行更改或优化。LSTM模型有许多参数可供调整,包括输入、输出、隐藏状态的维度、迭代次数、学习率等等,需要根据数据集的实际情况进行合理地选择和调整。
    3. 损失函数:针对不同的问题和模型选择不同的损失函数,需要注意不同的损失函数对于数据的要求和模型的表现有所不同,选择合适的损失函数也是模型分析和改进的重要方向之一。 具体到这个问题,根据提供的代码和数据,建议从以下几个方面进行排查和改进:
    4. 数据预处理:原始数据中包含postcode和time两列,这两列数据可能不太适合用来进行时间序列预测,建议删除之后再进行处理。同时,检查数据是否合理,是否需要进行归一化处理。可以使用sklearn中的MinMaxScaler()函数对数据进行归一化处理。
    5. 模型参数设置:针对这个问题,建议对模型参数进行适当的调整。例如,将LSTM模型的迭代次数从原来的2增加到4,同时调整hidden_size等参数,以期提高模型的表现。此外,可以尝试使用其他的优化器,如SGD等,观察对模型表现的影响。
    6. 损失函数选择:针对这个问题,建议选择适当的损失函数,例如采用均方误差(MSE)损失函数。同时,对于时间序列预测问题,可以使用平均绝对误差(MAE)等指标进行模型表现的评估。另外,建议在训练过程中增加一些指标的输出,例如每个epoch的损失函数值、平均绝对误差等统计指标,以便更好地监控模型的训练和表现。 代码示例参考:
    # 数据预处理
    data = pd.read_csv(path)
    data = data.drop(['postcode', 'time'], axis=1) # 删除postcode和time两列
    data = scaler.fit_transform(data) # 对数据进行归一化处理
    # 模型参数设置
    seq_length = 10 # 时间步长
    input_size = 3 # 原本为3,现在为5, 删去postcode与time
    num_layers = 4 # 将num_layers增加到4
    hidden_size = 512 # 调整hidden_size为512
    batch_size = 64
    n_iters = 10000 # 迭代次数
    lr = 0.0001
    output_size = 1
    split_ratio = 0.9
    module = Net(input_size, hidden_size, num_layers, output_size, batch_size, seq_length)
    criterion = torch.nn.MSELoss()
    optimizer = torch.optim.Adam(module.parameters(), lr=lr)
    # 模型训练过程中输出损失函数等指标
    for epoch in range(n_iters):
        ...
        loss = criterion(pred, y)
        mae = torch.mean(torch.abs(pred - y))
        if (epoch+1) % 50 == 0:
            print("Epoch [{}/{}], Loss: {:.4f}, MAE: {:.4f}".format(epoch+1, n_iters, loss.item(), mae.item()))
    
    评论

报告相同问题?

问题事件

  • 创建了问题 4月20日

悬赏问题

  • ¥15 isolar-AB软件安装后打开出错
  • ¥15 如何让usb软件在电脑拔插无记录
  • ¥15 ecology9的待办推送外部系统
  • ¥15 Mplus跑出来的数据只有原数据的一半
  • ¥15 vue项目添加全局处理解决一些开发问题
  • ¥40 微信小程序前后端交互
  • ¥50 数据预处理(大量数据)
  • ¥15 多设备数据融合可视化显示控制
  • ¥15 公众号关键词自动回复超链接
  • ¥18 help me! 希望大家来看看 吉~