LSTM 模型实践一

article/2025/10/2 12:55:16

简单介绍

原因:普通的RNN(Recurrent Neural Network)对于长期依赖问题效果比较差,当序列本身比较长时,神经网络模型的训练是采用backward进行,在梯度链式法则中容易出现梯度消失和梯度爆炸的问题。

解决:针对Simple RNN存在的问题,LSTM网络模型被提出,LSTM的核心是修改了增添了Cell State,即加入了LSTM CELL,通过输入门、输出门、遗忘门把上一时刻的hidden state和cell state传给下一个状态。

实践

实践1,生成sin(x)的周期序列并预测下一序列

参考:https://blog.csdn.net/hustchenze/article/details/78696771
seq为序列数据,k为LSTM模型循环的长度,使用1 ~ k的数据预测2~k+1的数据。

1.x轴对应的是[0,10],因为0到10,0.01为一份,可以分1000份
2.有用 x = torch.arange(1,N,0.1)试过,效果不好,所以尽量细一些
3. K取值为5效果也不错,第10轮Train Loss:为0.009138899855315685
4. SeriesGen(8*math.pi)该函数用pi的倍数,效果似乎更好Train 第10轮迭代Loss: 0.002424872014671564

import torch
import torch.nn as nn
from torch.autograd import *
import torch.optim as optim
import torch.nn.functional as F
import matplotlib.pyplot as plt
import numpy as npdef SeriesGen(N):x = torch.arange(1,N,0.01)return torch.sin(x)def trainDataGen(seq,k):dat = list() L = len(seq)for i in range(L-k-1):indat = seq[i:i+k]outdat = seq[i+1:i+k+1]dat.append((indat,outdat))return datdef ToVariable(x):tmp = torch.FloatTensor(x)return Variable(tmp)y = SeriesGen(10)
dat = trainDataGen(y.numpy(),10)class LSTMpred(nn.Module):def __init__(self,input_size,hidden_dim):super(LSTMpred,self).__init__()self.input_dim = input_sizeself.hidden_dim = hidden_dimself.lstm = nn.LSTM(input_size,hidden_dim)self.hidden2out = nn.Linear(hidden_dim,1)self.hidden = self.init_hidden()def init_hidden(self):return (Variable(torch.zeros(1, 1, self.hidden_dim)),Variable(torch.zeros(1, 1, self.hidden_dim)))def forward(self,seq):lstm_out, self.hidden = self.lstm(seq.view(len(seq), 1, -1), self.hidden)outdat = self.hidden2out(lstm_out.view(len(seq),-1))return outdatmodel = LSTMpred(1,6)
loss_function = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)for epoch in range(10):for seq, outs in dat[:700]:seq = ToVariable(seq)outs = ToVariable(outs)#outs = torch.from_numpy(np.array([outs]))optimizer.zero_grad()model.hidden = model.init_hidden()modout = model(seq)loss = loss_function(modout, outs)loss.backward()optimizer.step()print('Step: {}, Train Loss: {}'.format(epoch, loss))

打印的loss值:可以看出loss不断减小
在这里插入图片描述
预测,作图

predDat = []
for seq, trueVal in dat[700:]:seq = ToVariable(seq)trueVal = ToVariable(trueVal)predDat.append(model(seq)[-1].data.numpy()[0])fig = plt.figure()
plt.plot(y.numpy())
plt.plot(range(700,889),predDat)
plt.show()

结果:
在这里插入图片描述

实践2,航班人次预测

flights数据集下载:https://www.arangodb.com/wp-content/uploads/2017/08/GraphCourse_DemoData_ArangoDB-1.zip
参考 :https://blog.csdn.net/weixin_40066612/article/details/111319587/
与实践1最大不同:
1.训练数据归一化
2.创建序列的方法,最后返回的类似是((第1到12月12个数据),(第13个月的值),而不是实践一((i-k个数据),(i+1,k+1))
3.预测值为model(seq).item(),比起实践一model(seq)[-1].data.numpy()[0]更简单
结果:
在这里插入图片描述

实践三:Pytorch中的LSTM

Pytorch中 LSTM 的输入形式是一个 3D 的Tensor,每一个维度都有重要的意义,第一个维度就是序列本身, 第二个维度是mini-batch中实例的索引,第三个维度是输入元素的索引。
官网例子:用LSTM来进行词性标注
在这里插入图片描述

def prepare_sequence(seq, to_ix):idxs = [to_ix[w] for w in seq]return torch.tensor(idxs, dtype=torch.long)training_data = [("The dog ate the apple".split(), ["DET", "NN", "V", "DET", "NN"]),("Everybody read that book".split(), ["NN", "V", "DET", "NN"])
]
word_to_ix = {}
for sent, tags in training_data:for word in sent:if word not in word_to_ix:word_to_ix[word] = len(word_to_ix)
print(word_to_ix)
tag_to_ix = {"DET": 0, "NN": 1, "V": 2}# 实际中通常使用更大的维度如32维, 64维.
# 这里我们使用小的维度, 为了方便查看训练过程中权重的变化.
EMBEDDING_DIM = 6
HIDDEN_DIM = 6class LSTMTagger(nn.Module):def __init__(self, embedding_dim, hidden_dim, vocab_size, tagset_size):super(LSTMTagger, self).__init__()self.hidden_dim = hidden_dimself.word_embeddings = nn.Embedding(vocab_size, embedding_dim)# LSTM以word_embeddings作为输入, 输出维度为 hidden_dim 的隐藏状态值self.lstm = nn.LSTM(embedding_dim, hidden_dim)# 线性层将隐藏状态空间映射到标注空间self.hidden2tag = nn.Linear(hidden_dim, tagset_size)self.hidden = self.init_hidden()def init_hidden(self):# 一开始并没有隐藏状态所以我们要先初始化一个# 关于维度为什么这么设计请参考Pytoch相关文档# 各个维度的含义是 (num_layers, minibatch_size, hidden_dim)return (torch.zeros(1, 1, self.hidden_dim),torch.zeros(1, 1, self.hidden_dim))def forward(self, sentence):embeds = self.word_embeddings(sentence)lstm_out, self.hidden = self.lstm(embeds.view(len(sentence), 1, -1),self.hidden)tag_space = self.hidden2tag(lstm_out.view(len(sentence), -1))tag_scores = F.log_softmax(tag_space, dim=1)return tag_scoresmodel = LSTMTagger(EMBEDDING_DIM, HIDDEN_DIM, len(word_to_ix), len(tag_to_ix))
loss_function = nn.NLLLoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)# 查看训练前的分数
# 注意: 输出的 i,j 元素的值表示单词 i 的 j 标签的得分
# 这里我们不需要训练不需要求导,所以使用torch.no_grad()
with torch.no_grad():inputs = prepare_sequence(training_data[0][0], word_to_ix)tag_scores = model(inputs)print(tag_scores)for epoch in range(300):  # 实际情况下你不会训练300个周期, 此例中我们只是随便设了一个值for sentence, tags in training_data:# 第一步: 请记住Pytorch会累加梯度.# 我们需要在训练每个实例前清空梯度model.zero_grad()# 此外还需要清空 LSTM 的隐状态,# 将其从上个实例的历史中分离出来.model.hidden = model.init_hidden()# 准备网络输入, 将其变为词索引的 Tensor 类型数据sentence_in = prepare_sequence(sentence, word_to_ix)targets = prepare_sequence(tags, tag_to_ix)# 第三步: 前向传播.tag_scores = model(sentence_in)# 第四步: 计算损失和梯度值, 通过调用 optimizer.step() 来更新梯度loss = loss_function(tag_scores, targets)loss.backward()optimizer.step()# 查看训练后的得分
with torch.no_grad():inputs = prepare_sequence(training_data[0][0], word_to_ix)tag_scores = model(inputs)# 句子是 "the dog ate the apple", i,j 表示对于单词 i, 标签 j 的得分.# 我们采用得分最高的标签作为预测的标签. 从下面的输出我们可以看到, 预测得# 到的结果是0 1 2 0 1. 因为 索引是从0开始的, 因此第一个值0表示第一行的# 最大值, 第二个值1表示第二行的最大值, 以此类推. 所以最后的结果是 DET# NOUN VERB DET NOUN, 整个序列都是正确的!print(tag_scores)

http://chatgpt.dhexx.cn/article/aIOd9Vit.shtml

相关文章

理解LSTM模型

写在前面:这是翻译自colah的一篇博客,原文关于LSTM神经网络模型的理解写的非常直观、简单易懂,所以翻译过来帮助大家学习理解LSTM模型。 当然我不是按照原文一字不落的翻译,而是摘出其中对模型理解最有帮助的部分,然后…

LSTM模型预测时间序列(快速上手)

写在前面 LSTM模型的一个常见用途是对长时间序列数据进行学习预测,例如得到了某商品前一年的日销量数据,我们可以用LSTM模型来预测未来一段时间内该商品的销量。但对于不熟悉神经网络或者对没有了解过RNN模型的人来说,想要看懂LSTM模型的原理…

基于优化LSTM 模型的股票预测

LSTM自诞生以来,便以其在处理时间序列方面的优越性能在预测回归,语音翻译等领域广受青睐。今天,主要研究的是通过对LSTM模型的优化来实现股票预测。其实,关于股票预测,LSTM模型已经表现的相当成熟,然而&…

【机器学习】LSTM模型原理

文章目录 1. 序言2. RNN的基本概念与网络结构2.1 概念2.2 结构2.3 要素 3. LSTM的基本概念与网络结构3.1 概念3.2 结构3.3 要素 4. LSTM网络结构的说明5. 补充 1. 序言 临渊羡鱼不如归而结网 学习的目的是为了应用 2. RNN的基本概念与网络结构 LSTM是在RNN的基础上演进而来…

LSTM模型

LSTM比RNN复杂很多,RNN只有一个参数矩阵A,LSTM有4个(遗忘门,输入门,更新值,输出门) LSTM有一个非常重要的传输带Ct,过去的信息通过这个传输带送给下一时刻,不会发生太大变…

时间序列预测——LSTM模型(附代码实现)

目录 模型原理 模型实现 导入所需要的库 设置随机数种子 导入数据集 打印前五行数据进行查看 数据处理 归一化处理 查看归一化处理后的数据 将时间序列转换为监督学习问题 打印数据前五行 划分训练集和测试集 查看划分后的数据维度 搭建LSTM模型 得到损失图 模型…

phpstorm汉化操作

问题描述:如何进行phpstorm的汉化(原始为英文) 解决办法: 1.下载汉化包—resources_cn; 2.将汉化包添加到phpstorm文件夹下的lib文件夹内(其中的resources_en可以不删除); 3.重启Ph…

php 教程 phpstorm

目录 php开发流程 php 编辑工具 phpstudy phpstorm如何配置php环境 php 语言 什么是URI URL和URI差别: 一、HTTP和HTTPS的基本概念 经典类型和自定义 实现本机域映射​ php开发流程 1、下载php语言包 php作为一门语言,本身可以是一个纯绿色版的…

【PHP】Phpstorm环境配置与应用

一. Phpstorm环境配置 (1)点击左上端File,选择下拉框中的setting,进入环境配置页面,如下图 (2)如下图点击1处,选中下拉框中的Deployment,Type(图示2处),下拉框中选择Local or mounted folder …

PHP开发工具PhpStorm v2022.3——完全支持PHP 8.2

PhpStorm是一个轻量级且便捷的PHP IDE,其旨在提高用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查。可随时帮助用户对其编码进行调整,运行单元测试或者提供可视化debug功能。 PhpStorm v20…

phpstorm10.0.3汉化方法:

PhpStorm10.0.3汉化方法: 1、安装原版PhpStorm10.0.3,在打开最新的PhpStorm10汉化包下载地址: http://pan.baidu.com/s/1bouoyF9 2、双击用压缩软件打开resources_cn.jar(注意是打开而不是解压出来),将下载的汉化包…

PHPSTORM 中文版/汉化 即常用快捷键和配置

PHPStorm配置和快捷键大全(最新版)支持Win和Mac http://blog.csdn.net/fenglailea/article/details/53350080 推荐 1.汉化/中文版 使用的是开源的,翻译的还好,因为是开源,有些人不自觉,在翻译过程中加入广告 开源汉化地址&…

phpstorm10安装并汉化

一、下载phpstorm 下载地址:https://pan.baidu.com/s/1R64ZROVP1ljGbYfCwWjwxA 二、一直点击下一步安装即可 注意:第3步的时候选择一下支持的后缀 三、安装完毕,进行汉化 1、来到安装目录,PhpStorm 10.0.3\lib 目录下 2、…

PhpStorm 中文设置教程

本文仅供学习交流使用,如侵立删!demo下载见文末 Pycharm中文设置教程 1.首先打开PhpStorm ,点击file-settings.找到plugins,搜索Marketplace,然后搜索chinese。 2.找到之后直接点击安装. 3.安装完成之后点击Restart。…

PHPStorm运行PHP代码(新手教程)

PHPStorm是流行对PHP及前端开发IDE,在开发者初次使用写PHP代码时该怎么用呢~ 1、Create New Project 2、选择PHP Empty Project,并新建一个空目录(名字建议为英文,目录不要放在C盘!!!&#xff…

PHP教程二:开发工具 phpstorm 的下载、安装与激活

接着上一章节,我们继续开发工具的安装 phpstorm 的概括:PhpStorm 是 JetBrains 公司开发的一款商业的 PHP 集成开发工具,旨在提高用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检…

下载phpstorm2021汉化包

网址 网址:https://plugins.jetbrains.com/plugin/13710-chinese-simplified-language-pack---- 点安装到phpstorm 打开phpstorm2021版本 点file-------seeting-------k~(省略了)-----搜索chinese--------最后点安装就可以了。

phpstorm官方汉化包

注意:这个汉化包是官方出品的,并不是网友做的,所以有很强的兼容性不会出现各种乱七八糟bug以及汉化不完全的现象 先一睹为快 我们可以看到全都有翻译 以前的我还觉得那么多选项和按钮都不敢乱点,或者点之前都要百度一下英文 现在可以随便…

PHP开发工具phpstorm的安装及汉化详解

PHP开发工具phpstorm的安装及汉化详解 最近在研究PHP,PHP是目前较为流行的一款PHP开发工具,内容丰富,功能强大,下面将详细介绍一下他的具体安装及汉化步骤。 下载 这个是PHPstorm官网地址,可直接免费下载 我下载的是…

phpstorm安装+新建项目+phpstorm中文版

一、 安装phpstorm 1. 运行安装包 2. 点击next 3. 选择安装路径 点击next 4. 我的电脑系统是windows64位 所以选择64-bit 5. 点击INSTALL安装 6.安装成功后 运行phpstorm 选择evaluate for free 然后点击evaluate 二、 新建项目 1. 点击new project 2. 选择项目路径 点击c…