循环神经网络四-LSTM和GRU的使用

1.介绍

LSTM和GRU都是由torch.nn提供

torch.nn.LSTM(input_size,hidden_size,num_layers,batch_first,dropout,bidirectional) 其中:

1.input_size:输入数据的形状,即embedding_dim

2.hidden_size:隐藏神经元的数量,即每一层由多少个LSTM单元

3.num_layer:即RNN中LSTM的数量

4.batch_first:默认为False,输入数据需要[seq_len,batch,feature],如果为True,则为[batch,seq_len,feature]

5.dropout:dropout的比例,默认为0,dropout是一种训练过程中让部分参数随机失活的一种方式,能够提高训练速度,同时能解决过拟合的问题。这里是在LSTM的最后一层,对每个输出进行dropout

6.bidiretional:是否使用双向LSTM,默认为False

LSTM的输入:结合上一章内容,实例化LSTM的时候不仅要传入数据还要传入前一次的h_0和C_0

LSTM的输出:默认输出为output,(h_n,c_n)

1.output输出形式:(seq_len,batch,num_directions*hidden_size) 当batch_first=False时

2.h_n:(num_layers * num_directions, batch, hidden_size)

3.c_n:(num_layers * num_directions, batch, hidden_size)

二.LSTM使用示例

假设输入为input,形状为[10,20],假设embedding的形状是[100,30]

python 复制代码
import torch

batch_size=10  # 数据的条数
seq_len=20    #  没条数据的长度
embedding_dim=30  # 每条数据用多长的向量来表示
word_vocab=100   # 生成的词典中词语的总数
hidden_size=18   # 隐层中的lstm的个数
num_layer=2  # 多少个隐层

# 准备数据最小值为0最大值为一百的10行20列的数据
input=torch.randint(low=0,high=100,size=(batch_size,seq_len))
# 实例化embedding
embedding=torch.nn.Embedding(word_vocab,embedding_dim)
# 实例化LSTM
lstm=torch.nn.LSTM(embedding_dim,hidden_size,num_layer)
# 进行mebed操作
embed=embedding(input)
print(embed.size())  # torch.Size([10, 20, 30])
# 数据转化为batch_first=False的形状
embed=embed.permute(1,0,2)  # torch.Size([20, 10, 30])

# 初始化状态,如果不初始化,torch默认初始值全为0
h_0=torch.rand(num_layer,batch_size,hidden_size)  #torch.Size([2, 10, 18])

c_0=torch.rand(num_layer,batch_size,hidden_size)  #torch.Size([2, 10, 18])

output,(h_1,c_1)=lstm(embed,(h_0,c_0))  
print(output.size())  #torch.Size([20, 10, 18])
print(c_1.size())  #torch.Size([2, 10, 18])
print(h_1.size())   #torch.Size([2, 10, 18])

三.GRU的使用示例

和LSTM相同,也是从troch.nn中导入,而且参数也和LSTM相同。不同的是输入和输出

1.输入:输入的时候只用输入input和h_0,相比LSTM少了c_0

2.输出:输出两个数据output(seq_len, batch, num_directions*hidden_size),

h_n=(num_layers * num_directions, batch,hidden_size)

四.双向LSTM

如果需要使用双向LSTM,则要将实例化LSTM的过程中,将参数bidriectional设置为True,同时h_0,c_0的维度中num_layer*2

python 复制代码
import torch

batch_size=10  # 数据的条数
seq_len=20    #  没条数据的长度
embedding_dim=30  # 每条数据用多长的向量来表示
word_vocab=100   # 生成的词典中词语的总数
hidden_size=18   # 隐层中的lstm的个数
num_layer=2  # 多少个隐层

# 准备数据最小值为0最大值为一百的10行20列的数据
input=torch.randint(low=0,high=100,size=(batch_size,seq_len))
# 实例化embedding
embedding=torch.nn.Embedding(word_vocab,embedding_dim)
# 实例化LSTM,使用双向LSTM,所以bidirectional设置为True
lstm=torch.nn.LSTM(embedding_dim,hidden_size,num_layer, bidirectional=True)
# 进行mebed操作
embed=embedding(input)
print(embed.size())  # torch.Size([10, 20, 30])
# 数据转化为batch_first=False的形状
embed=embed.permute(1,0,2)  # torch.Size([20, 10, 30])

# 初始化状态,如果不初始化,torch默认初始值全为0,使用双向LSTM时,num_layer要乘2,也就是要两倍的隐藏层来实现双向
h_0=torch.rand(num_layer*2,batch_size,hidden_size)  #torch.Size([2, 10, 18])

c_0=torch.rand(num_layer*2,batch_size,hidden_size)  #torch.Size([2, 10, 18])

output,(h_1,c_1)=lstm(embed,(h_0,c_0))  
print(output.size())  #torch.Size([20, 10, 18])
print(c_1.size())  #torch.Size([2, 10, 18])
print(h_1.size())   #torch.Size([2, 10, 18])
相关推荐
聚客AI10 分钟前
95%企业AI失败?揭秘LangGraph+OceanBase融合数据层如何破局!
大数据·图像处理·人工智能·机器学习·语言模型·自然语言处理·数据分析
Christo311 分钟前
TSMC-1987《Convergence Theory for Fuzzy c-Means: Counterexamples and Repairs》
人工智能·算法·机器学习·kmeans
LeonDL16812 分钟前
【3D通用视觉框架】基于Qt5开发的3D视觉框架软件,纯底层,全套源码,开箱即用
人工智能·通用3d视觉框架软件·机器视觉软件框架·3d视觉测量与检测软件系统·qt/c++·3d测高、平面度等测量工具·测高、断差、共面度、轮廓等功能
聚客AI26 分钟前
✅5大实战技巧:优化RAG召回质量,避免“召回不足”灾难!
人工智能·llm·增强现实
机器之心34 分钟前
从复刻魔术开始,RoboMirage打开了机器人仿真的新世界
人工智能·openai
飞思实验室1 小时前
校企合作| 长春大学旅游学院副董事长张海涛率队到访卓翼智能,共绘无人机技术赋能“AI+文旅”发展新蓝图
人工智能·无人机
fanged1 小时前
HarvardX TinyML小笔记2(番外3:数据工程)
深度学习
小王爱学人工智能1 小时前
OpenCV的轮廓检测
人工智能·opencv·计算机视觉
W-GEO1 小时前
AI代码生成神器终极对决:CodeLlama vs StarCoder vs Codex,谁才是开发者的「最佳拍档」?
人工智能
AI Echoes1 小时前
一款为开发者而生的开源全栈LLMOps平台
人工智能·python·langchain·agent