pytorch之LSTM(四)

2024-08-28 01:32
文章标签 pytorch lstm

本文主要是介绍pytorch之LSTM(四),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、序列模型和长期记忆网络

至此,我们已经看到了各种前馈网络。即,网络根本不维持任何状态。这可能不是我们想要的行为。序列模型是NLP的核心:它们是在输入之间存在一定时间依存关系的模型。序列模型的经典示例是用于词性标记的隐马尔可夫模型。另一个示例是条件随机场。

递归神经网络是维持某种状态的网络。例如,它的输出可以用作下一个输入的一部分,以便信息可以随着网络在序列上传递而传播。对于LSTM,对于序列中的每个元素,都有一个对应的隐藏状态 ht,原则上可以包含序列中任意点的信息。我们可以使用隐藏状态来预测语言模型中的单词,例如词性标签,槽位识别。

2、Pytorch中的LSTM

Pytorch的LSTM输入一般为3D张量。第1维为词数,第2维为batch数,第3维为词向量的维度。LSTM的原理可以看博客循环神经网络。如果我们想对句子“ The cow jumped”运行序列模型,我们的输入应如下所示

#LSTM依赖的数学函数及输入输出参数详解
lstm=nn.LSTM(3,4,2) #输入维度3,输出维度3,层数2
'''
nn.LSTM将多层长短期记忆(LSTM)RNN应用于输入顺序。
对于输入序列中的每个元素,每一层计算以下内容
对应的数学函数:
math::\begin{array}{ll} \\i_t = \sigma(W_{ii} x_t + b_{ii} + W_{hi} h_{t-1} + b_{hi}) \\f_t = \sigma(W_{if} x_t + b_{if} + W_{hf} h_{t-1} + b_{hf}) \\g_t = \tanh(W_{ig} x_t + b_{ig} + W_{hg} h_{t-1} + b_{hg}) \\o_t = \sigma(W_{io} x_t + b_{io} + W_{ho} h_{t-1} + b_{ho}) \\c_t = f_t \odot c_{t-1} + i_t \odot g_t \\h_t = o_t \odot \tanh(c_t) \\\end{array}:math:`h_t` 表示`t`时刻的隐藏状态, :math:`c_t`表示`t`时刻的cell状态, :math:`x_t` 表示`t`时刻的输入, :math:`h_{t-1}`表示`t-1`时刻的隐藏状态或者初始状态math:`f_t`,:math:`g_t`,:math:`o_t`分别表示输入,遗忘、cell、输出门:math:`\sigma`表示sigmoid 函数, :math:`\odot` Hadamard乘积.
Args:input_size:输入x的特征维度hidden_size:处于隐藏状态“h”的特征维度num_layers:循环图层数。例如,设置``num_layers = 2``意味着将两个LSTM堆叠在一起以形成“堆叠的LSTM”,第二个LSTM接收第一个LSTM的输出,计算最终结果。默认值:1bias:如果为False,则该图层不使用偏见权重“ b_ih”和“ b_hh”。默认值:``True``batch_first:如果为``True'',则提供输入和输出张量作为(批次,序列,特征)。默认值:``False''dropout:如果非零,则在每个输出的输出端引入一个“ Dropout”层LSTM层(最后一层除外),丢失概率等于attr:`dropout`。默认值:0bidirectional:如果为``True'',则变为双向LSTM。默认值:``False''Inputs: input, (h_0, c_0)- input张量的shape为 `(seq_len, batch, input_size)`: 张量包括了输入序列的特征- h_0张量的shape为`(num_layers * num_directions, batch, hidden_size)`: 张量包含了每一batch中初始隐藏状态如果LSTM是双向的, num_directions为2, 否则为1.- c_0张量的shape为 `(num_layers * num_directions, batch, hidden_size)`: 张量包含了每一batch中初始cell状态如果`(h_0, c_0)` 未提供, h_0,c_0默认为全0张量
Outputs: output, (h_n, c_n)- output张量的shape为`(seq_len, batch, num_directions * hidden_size)`:张量是LSTM最后一层每个t时刻o_t如果class:`torch.nn.utils.rnn.PackedSequence` 已经作为输入给出,输出也将是packed序列。对于unpacked的情况,可以将方向分开使用``output.view(seq_len,batch,num_directions,hidden_size)``,前进和后退分别是方向“ 0”和“ 1”。- h_n张量的shape为`(num_layers * num_directions, batch, hidden_size)`: 张量是LSTM最后一层t(t = seq_len)时刻h_t隐藏状态可通过h_n.view(num_layers, num_directions, batch, hidden_size)获取每层隐藏状态。- c_n张量的shape为`(num_layers * num_directions, batch, hidden_size)`: 张量是LSTM最后一层t(t = seq_len)时刻c_t状态'''  
inputs=[torch.randn(1,3) for _ in range(5)] #构建一个句子长度为5,维度为3的输入句子,一个batch的数据#初始化隐层状态和cell状态 hidden输入维度(num_layers * num_directions, batch, hidden_size)
hidden = (torch.randn(2, 1, 4),torch.randn(2, 1, 4))'''
before: 1 tensor([[[ 0.0645, -0.1050,  0.1427, -0.0289]]], grad_fn=<StackBackward>) (tensor([[[ 0.0465,  0.0638,  0.3326, -0.2273]],[[ 0.0645, -0.1050,  0.1427, -0.0289]]], grad_fn=<StackBackward>), tensor([[[ 0.0992,  0.2878,  0.9721, -0.4657]],[[ 0.1024, -0.3557,  0.6139, -0.0391]]], grad_fn=<StackBackward>))
after: 1 tensor([[[ 0.1458, -0.0954,  0.1286,  0.1728]]], grad_fn=<StackBackward>) (tensor([[[ 0.0157,  0.2103,  0.2820, -0.2021]],[[ 0.1458, -0.0954,  0.1286,  0.1728]]], grad_fn=<StackBackward>), tensor([[[ 0.0302,  0.6760,  0.6505, -0.4757]],[[ 0.2552, -0.2182,  0.3291,  0.3289]]], grad_fn=<StackBackward>))
'''for i,input_x in enumerate(inputs):input_x=input_x.view(1,1,-1)if i==0:input_all=input_xelse:input_all=torch.cat((input_all,input_x),dim=0)out,hidden=lstm(input_x,hidden)print("after:",i,out,hidden) print(input_all.size())
out,hidden=lstm(input_all,hidden)
print('all seq',out,hidden) #out:seq_len*hidden_dim 

3、LSTM用于词性标记

目前使用LSTM实现词性标注的实例,目前未使用Viterbi或Forward-Backward之类的算法。在此处会使用词向量,实现参考pytorch之词嵌(三) 

流程如下:输入句子为 w1,…,wM。wi∈VT 是标签集,yi 对应单词的标签wi,对单词标签wi 的预测为ŷi

预测序列为 ŷ1,…,ŷM; ŷ i∈T。

预测目标函数为:

#词性标注LSTM使用实例
def word2id(data,w2i):for ws,tag in data:for w in ws:if w not in w2i:w2i[w]=len(w2i)#词性标注数据
train = [("The dog ate the apple".split(), ["DET", "NN", "V", "DET", "NN"]),("Everybody read that book".split(), ["NN", "V", "DET", "NN"])
]w2i={}
t2i={"DET": 0, "NN": 1, "V": 2}
word2id(train,w2i)EMBEDDING_DIM = 6
HIDDEN_DIM = 6class LstmTag(nn.Module):def __init__(self,embedding_dim,hidden_dim,vocab_size,tag_size):super(LstmTag,self).__init__()self.embedding=nn.Embedding(vocab_size,embedding_dim)self.lstm=nn.LSTM(embedding_dim,hidden_dim)self.lstm2tag=nn.Linear(hidden_dim,tag_size)def forward(self,x):embeds=self.embedding(x) o,h=self.lstm(embeds.view(len(x),1,-1))tags=self.lstm2tag(o.view(len(x),-1))tags_prob=F.log_softmax(tags)return tags_probmodel=LstmTag(EMBEDDING_DIM,HIDDEN_DIM,len(w2i),len(t2i))
loss_function=nn.NLLLoss()
opt=optim.SGD(model.parameters(),lr=0.1)for input_x,y in train:ids=torch.tensor([w2i[w] for w in input_x],dtype=torch.long)targets=torch.tensor([t2i[w] for w in y],dtype=torch.long)probs=model(ids)print(probs)loss=loss_function(probs,targets)loss.backward()opt.step()print(loss)

 

 

 

这篇关于pytorch之LSTM(四)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113348

相关文章

PyTorch使用教程之Tensor包详解

《PyTorch使用教程之Tensor包详解》这篇文章介绍了PyTorch中的张量(Tensor)数据结构,包括张量的数据类型、初始化、常用操作、属性等,张量是PyTorch框架中的核心数据结构,支持... 目录1、张量Tensor2、数据类型3、初始化(构造张量)4、常用操作5、常用属性5.1 存储(st

Nn criterions don’t compute the gradient w.r.t. targets error「pytorch」 (debug笔记)

Nn criterions don’t compute the gradient w.r.t. targets error「pytorch」 ##一、 缘由及解决方法 把这个pytorch-ddpg|github搬到jupyter notebook上运行时,出现错误Nn criterions don’t compute the gradient w.r.t. targets error。注:我用

【超级干货】2天速成PyTorch深度学习入门教程,缓解研究生焦虑

3、cnn基础 卷积神经网络 输入层 —输入图片矩阵 输入层一般是 RGB 图像或单通道的灰度图像,图片像素值在[0,255],可以用矩阵表示图片 卷积层 —特征提取 人通过特征进行图像识别,根据左图直的笔画判断X,右图曲的笔画判断圆 卷积操作 激活层 —加强特征 池化层 —压缩数据 全连接层 —进行分类 输出层 —输出分类概率 4、基于LeNet

pytorch torch.nn.functional.one_hot函数介绍

torch.nn.functional.one_hot 是 PyTorch 中用于生成独热编码(one-hot encoding)张量的函数。独热编码是一种常用的编码方式,特别适用于分类任务或对离散的类别标签进行处理。该函数将整数张量的每个元素转换为一个独热向量。 函数签名 torch.nn.functional.one_hot(tensor, num_classes=-1) 参数 t

自然语言处理系列六十三》神经网络算法》LSTM长短期记忆神经网络算法

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列六十三神经网络算法》LSTM长短期记忆神经网络算法Seq2Seq端到端神经网络算法 总结 自然语言处理系列六十三 神经网络算法》LSTM长短期记忆神经网络算法 长短期记忆网络(LSTM,Long S

pytorch计算网络参数量和Flops

from torchsummary import summarysummary(net, input_size=(3, 256, 256), batch_size=-1) 输出的参数是除以一百万(/1000000)M, from fvcore.nn import FlopCountAnalysisinputs = torch.randn(1, 3, 256, 256).cuda()fl

Tensorflow lstm实现的小说撰写预测

最近,在研究深度学习方面的知识,结合Tensorflow,完成了基于lstm的小说预测程序demo。 lstm是改进的RNN,具有长期记忆功能,相对于RNN,增加了多个门来控制输入与输出。原理方面的知识网上很多,在此,我只是将我短暂学习的tensorflow写一个预测小说的demo,如果有错误,还望大家指出。 1、将小说进行分词,去除空格,建立词汇表与id的字典,生成初始输入模型的x与y d

CNN-LSTM模型中应用贝叶斯推断进行时间序列预测

这篇论文的标题是《在混合CNN-LSTM模型中应用贝叶斯推断进行时间序列预测》,作者是Thi-Lich Nghiem, Viet-Duc Le, Thi-Lan Le, Pierre Maréchal, Daniel Delahaye, Andrija Vidosavljevic。论文发表在2022年10月于越南富国岛举行的国际多媒体分析与模式识别会议(MAPR)上。 摘要部分提到,卷积

Python(TensorFlow和PyTorch)两种显微镜成像重建算法模型(显微镜学)

🎯要点 🎯受激发射损耗显微镜算法模型:🖊恢复嘈杂二维和三维图像 | 🖊模型架构:恢复上下文信息和超分辨率图像 | 🖊使用嘈杂和高信噪比的图像训练模型 | 🖊准备半合成训练集 | 🖊优化沙邦尼尔损失和边缘损失 | 🖊使用峰值信噪比、归一化均方误差和多尺度结构相似性指数量化结果 | 🎯训练荧光显微镜模型和对抗网络图形转换模型 🍪语言内容分比 🍇Python图像归一化

Pytorch环境搭建时的各种问题

1 问题 1.一直soving environment,跳不出去。网络解决方案有:配置清华源,更新conda等,没起作用。2.下载完后,有3个要done的东西,最后那个exe开头的(可能吧),总是报错。网络解决方案有:用管理员权限打开prompt等,没起作用。3.有时候配置完源,安装包的时候显示什么https之类的东西,去c盘的用户那个文件夹里找到".condarc"文件把里面的网址都改成htt