它的结构示意图如下所示
发布时间:2025-06-24 19:12:19 作者:北方职教升学中心 阅读量:677
同样,该优化方式也可以被用于其他RNN结构。
忘记门
下图所示为忘记门的操作,忘记门决定模型会从细胞状态中丢弃什么信息。
作为单元预测机制,LSTM可以预测单一变量的未来值,例如股票价格、
双向RNN的处理过程就是在正向传播的基础上再进行一次反向传播。具体地,我们可以将多个变量的历史数据作为LSTM的输入,将多个变量的未来值作为LSTM的输出。忘记们的功能就是先去记忆中找到一千那个旧的主语(并没有真正执行忘记的操作,只是找到而已。
有关双向RNN(LSTM)我会在后续文章中讲到,这里只是大致介绍一下。(如果需要丢弃对应位置权重设置为0),然后,将结果加上 *
使细胞状态获得新的信息。
例如:在一个语言模型的例子中,假设细胞状态会包含当前主语的性别,于是根据这个状态便可以选择正确的代词。在时间序列预测中,LSTM既可以多元预测机制又可以作为单元预测机制使用。它的结构示意图如下所示。
输出门:决定什么时候需要把状态和输入放在一起输出。
忘记门:决定什么时候将以前的状态忘记。其他的网络结构(GRU)、
忘记门会读取前一序列模型的输出和当前模型的输入
来控制细胞状态中的每个数是否保留。如图所示是一个沿着事件展开的双向循环神经网络(我们用LSTM举例实际可以是其他任何一个RNN结构)
双向RNN会比单项RNN多一个隐藏层,6个独特的权值在每一个时步被重复利用,6个权值分别对应:输入到向前和向后隐含层,隐含层到隐含层自身,向前和向后隐含层到输出层。正向传播和反向传播都连接着一个输出层。
如果大家想了解更多LSTM的变体,可以查看一下其他相关资料例如该论文。
# 定义窗口大小test_data_size = 350# 训练集和测试集的尺寸划分test_size = 0.15train_size = 0.85
这里定义了数据加载器的操作
def create_inout_sequences(input_data, tw): inout_seq = [] L = len(input_data) for i in range(L - tw): train_seq = input_data[i:i + tw] if (i + tw + 4) > len(input_data): break train_label = input_data[i + tw:i + tw + 1] inout_seq.append((train_seq, train_label)) return inout_seqtrain_window = 350# 定义训练器的的输入train_inout_seq = create_inout_sequences(train_data_normalized, train_window)
模型的本身其中包含一个LSTM层和一个全连接层进行结果的输出
class LSTM(nn.Module): def __init__(self, input_dim=1, hidden_dim=350, output_dim=1): super(LSTM, self).__init__() self.hidden_dim = hidden_dim self.lstm = nn.LSTM(input_dim, hidden_dim, batch_first=True) self.fc = nn.Linear(hidden_dim, output_dim) def forward(self, x): x = x.unsqueeze(1) h0_lstm = torch.zeros(1, self.hidden_dim).to(x.device) c0_lstm = torch.zeros(1, self.hidden_dim).to(x.device) out, _ = self.lstm(x, (h0_lstm, c0_lstm)) out = out[:, -1] out = self.fc(out) return out
这里定义了模型损失函数和优化器,其中的Train代表着是否进行训练。季节性和周期性等因素,并使用这些因素来预测未来的值。
if Train: losss = [] lstm_model.train() # 训练模式 for i in range(epochs): start_time = time.time() # 计算起始时间 for seq, labels in train_inout_seq: lstm_model.train() optimizer.zero_grad() y_pred = lstm_model(seq) single_loss = loss_function(y_pred, labels) losss.append(single_loss.detach().numpy()) single_loss.backward() optimizer.step() if i % 1 == 1: print(f'epoch: {i:3} loss: {single_loss.item():10.8f}') torch.save(lstm_model.state_dict(), 'save_model.pth') print(f"模型已保存,用时:{(time.time() - start_time) / 60:.4f} min") plt.plot(losss) # 设置图表标题和坐标轴标签 plt.title('Training Error') plt.xlabel('Epoch') plt.ylabel('Error') # 保存图表到本地 plt.savefig('training_error.png')else: # 加载模型进行预测 lstm_model.load_state_dict(torch.load('save_model.pth')) lstm_model.eval() # 评估模式 results = [] losss = [] test_inout_seq = create_inout_sequences(test_data_normalized, train_window) for seq, labels in test_inout_seq: # 这里的pred = lstm_model(seq)[0].item()是结果的输出这里只保存了输出的第一个值如果想拿出更多的预测值可以修改数字0用切片的方式 pred = lstm_model(seq)[0].item() results.append(pred) mae = calculate_mae(pred, labels.detach().numpy()) # MAE误差计算绝对值(预测值 - 真实值) losss.append(mae) print("模型预测结果:", results) print("预测误差MAE:", losss)
后期我也会讲一些最新的预测模型包括Informer,TPA-LSTM,ARIMA,XGBOOST,Holt-winter,移动平均法等等一系列关于时间序列预测的模型,包括深度学习和机器学习方向的模型我都会讲,你可以根据需求选取适合你自己的模型进行预测,如果有需要可以+个关注,包括本次模型我自己的代码大家有需要我也会放出百度网盘下载链接!!
其它时间序列预测模型的讲解!
--------------------------------------------------------MTS-Mixers---------------------------------------------------------
【全网首发】(MTS-Mixers)(Python)(Pytorch)最新由华为发布的时间序列预测模型实战案例(一)(包括代码讲解)实现企业级预测精度包括官方代码BUG修复Transform模型
--------------------------------------------------------Holt-Winters--------------------------------------------------------
时间序列预测模型实战案例(二)(Holt-Winter)(Python)结合K-折交叉验证进行时间序列预测实现企业级预测精度(包括运行代码以及代码讲解)
如果大家有不懂的也可以评论区留言一些报错什么的大家可以讨论讨论看到我也会给大家解答如何解决!