LSTM训练模型预测结果恒为无波动水平线的问题排查求助
LSTM训练模型预测结果恒为无波动水平线的问题排查求助
大家好,我最近在训练一个LSTM模型做时序预测,但碰到了非常棘手的问题——模型训练后的预测结果始终是一条没有任何波动的水平线,完全没法拟合数据的真实趋势。我把自己写的模型代码贴在下面,想请各位大佬帮忙排查下可能的问题,谢谢大家了!
我的LSTM模型代码如下:
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 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 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.ran...
注:c_0的代码被截断了,实际是类似torch.randn(...)的初始化逻辑。
目前我自己怀疑的几个方向,但还没找到问题所在:
- 是不是LSTM的输入输出维度匹配出了问题?比如
batch_first=True的情况下,输入形状有没有符合要求? - 每次前向传播都重新随机初始化
h_0和c_0是不是不合理?是不是应该让模型自己维护隐藏状态,而不是每次都随机生成? - 全连接层的维度设置
num_layers*hidden_size有没有问题?是不是应该取LSTM输出的最后一个时间步的隐藏状态来输入到全连接层? - 有没有可能是数据预处理(比如归一化)的问题?不过目前我还没发现数据处理环节有明显错误。
如果各位有其他排查思路或者发现代码里的问题,欢迎指点!
备注:内容来源于stack exchange,提问作者user24521131
相关产品推荐
相关产品推荐

