【PyTorch API】 nn.RNN 和 nn.LSTM 介绍和代码详解

这篇具有很好参考价值的文章主要介绍了【PyTorch API】 nn.RNN 和 nn.LSTM 介绍和代码详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. nn.RNN 构建单向 RNN

torch.nn.RNN 的 PyTorch 链接:torch.nn.RNN(*args, **kwargs)

nn.RNN 的用法和输入输出参数的介绍直接看代码:

import torch
import torch.nn as nn

# 单层单向 RNN
embed_dim = 5    # 每个输入元素的特征维度,如每个单词用长度为 5 的特征向量表示
hidden_dim = 6   # 隐状态的特征维度,如每个单词在隐藏层中用长度为 6 的特征向量表示
rnn_layers = 4   # 循环层数
rnn = nn.RNN(input_size=embed_dim, hidden_size=hidden_dim, num_layers=rnn_layers, batch_first=True)

# 输入
batch_size = 2
sequence_length = 3    # 输入的序列长度,如 i love you 的序列长度为 3,每个单词用长度为 feature_num 的特征向量表示
input = torch.randn(batch_size, sequence_length, embed_dim)
h0 = torch.randn(rnn_layers, batch_size, hidden_dim)

# output 表示隐藏层在各个 time step 上计算并输出的隐状态
# hn 表示所有掩藏层的在最后一个 time step 隐状态, 即单词 you 的隐状态
output, hn = rnn(input, h0)

print(f"output = {output}")
print(f"hn = {hn}")
print(f"output.shape = {output.shape}")     # torch.Size([2, 3, 6])    [batch_size, sequence_length, hidden_dim]
print(f"hn.shape = {hn.shape}")             # torch.Size([4, 2, 6])    [rnn_layers, batch_size, hidden_dim]


"""
output = tensor([[[-0.3727, -0.2137, -0.3619, -0.6116, -0.1483,  0.8292],
         [ 0.1138, -0.6310, -0.3897, -0.5275,  0.2012,  0.3399],
         [-0.0522, -0.5991, -0.3114, -0.7089,  0.3824,  0.1903]],

        [[ 0.1370, -0.6037,  0.3906, -0.5222,  0.8498,  0.8887],
         [-0.3463, -0.3293, -0.1874, -0.7746,  0.2287,  0.1343],
         [-0.2588, -0.4145, -0.2608, -0.3799,  0.4464,  0.1960]]],
       grad_fn=<TransposeBackward1>)
       
hn = tensor([[[-0.2892,  0.7568,  0.4635, -0.2106, -0.0123, -0.7278],
         [ 0.3492, -0.3639, -0.4249, -0.6626,  0.7551,  0.9312]],

        [[ 0.0154,  0.0190,  0.3580, -0.1975, -0.1185,  0.3622],
         [ 0.0905,  0.6483, -0.1252,  0.3903,  0.0359, -0.3011]],

        [[-0.2833, -0.3383,  0.2421, -0.2168, -0.6694, -0.5462],
         [ 0.2976,  0.0724, -0.0116, -0.1295, -0.6324, -0.0302]],

        [[-0.0522, -0.5991, -0.3114, -0.7089,  0.3824,  0.1903],
         [-0.2588, -0.4145, -0.2608, -0.3799,  0.4464,  0.1960]]],
       grad_fn=<StackBackward0>)

output.shape = torch.Size([2, 3, 6])
hn.shape = torch.Size([4, 2, 6])
"""

需要特别注意的是 nn.RNN 的第二个输出 hn 表示所有掩藏层的在最后一个 time step 隐状态,听起来很难理解,看下面的红色方框内的数据就懂了。即 output[:, -1, :] = hn[-1, : , :]

这里 hn 保存了四次循环中最后一个 time step 隐状态的数值,以输入 i love you 为了,hn 保存的是单词 you 的隐状态。

【PyTorch API】 nn.RNN 和 nn.LSTM 介绍和代码详解,# PyTorch算子/函数用法,rnn,lstm,pytorch,深度学习

2. nn.LSTM 构建单向 LSTM

torch.nn.RNN 的 PyTorch 链接:torch.nn.LSTM(*args, **kwargs)

nn.LSTM 的用法和输入输出参数的介绍直接看代码:

import torch
import torch.nn as nn


batch_size = 4
seq_len = 3      # 输入的序列长度
embed_dim = 5    # 每个输入元素的特征维度
hidden_size = 5 * 2    # 隐状态的特征维度,根据工程经验可取 hidden_size = embed_dim * 2
num_layers = 2    # LSTM 的层数,一般设置为 1-4 层;多层 LSTM 的介绍可以参考 https://blog.csdn.net/weixin_41041772/article/details/88032093

lstm = nn.LSTM(input_size=embed_dim, hidden_size=hidden_size, num_layers=num_layers, batch_first=True)

# h0 可以缺省
input = torch.randn(batch_size, seq_len, embed_dim)

"""
output 表示隐藏层在各个 time step 上计算并输出的隐状态
hn 表示所有隐藏层的在最后一个 time step 隐状态, 即单词 you 的隐状态;所以 hn 与句子长度 seq_len 无关
hn[-1] 表示最后一个隐藏层的在最后一个 time step 隐状态,即 LSTM 的输出
cn 表示句子的最后一个单词的细胞状态;所以 cn 与句子长度 seq_len 无关
其中 output[:, -1, :] = hn[-1,:,:]
"""
output, (hn, cn) = lstm(input)


print(f"output.shape = {output.shape}")   # torch.Size([4, 3, 10])
print(f"hn.shape = {hn.shape}")           # torch.Size([2, 4, 10])
print(f"cn.shape = {cn.shape}")           # torch.Size([2, 4, 10])

print(f"output = {output}")
print(f"hn = {hn}")
print(f"output[:, -1, :] = {output[:, -1, :]}")
print(f"hn[-1,:,:] = {hn[-1,:,:]}")


"""
output = tensor([[[ 0.0447,  0.0111,  0.0292,  0.0692, -0.0547, -0.0120, -0.0202, -0.0243,  0.1216,  0.0643],
                  [ 0.0780,  0.0279,  0.0231,  0.1061, -0.0819, -0.0027, -0.0269, -0.0509,  0.1800,  0.0921],
                  [ 0.0993,  0.0160,  0.0516,  0.1402, -0.1146, -0.0177, -0.0607, -0.0715,  0.2110,  0.0954]],

                 [[ 0.0542, -0.0053,  0.0415,  0.0899, -0.0561, -0.0376, -0.0327, -0.0276,  0.1159,  0.0545],
                  [ 0.0819, -0.0015,  0.0640,  0.1263, -0.1021, -0.0502, -0.0495, -0.0464,  0.1814,  0.0750],
                  [ 0.0914,  0.0034,  0.0558,  0.1418, -0.1327, -0.0643, -0.0616, -0.0674,  0.2195,  0.0886]],

                 [[ 0.0552, -0.0006,  0.0351,  0.0864, -0.0486, -0.0192, -0.0305, -0.0289,  0.1103,  0.0554],
                  [ 0.0835, -0.0099,  0.0415,  0.1396, -0.0758, -0.0829, -0.0616, -0.0604,  0.1740,  0.0828],
                  [ 0.1202, -0.0113,  0.0570,  0.1608, -0.0836, -0.0801, -0.0792, -0.0874,  0.1923,  0.0829]],

                 [[ 0.0115, -0.0026,  0.0267,  0.0747, -0.0867, -0.0250, -0.0199, -0.0154,  0.1158,  0.0649],
                  [ 0.0628,  0.0003,  0.0297,  0.1191, -0.1028, -0.0342, -0.0509, -0.0496,  0.1759,  0.0831],
                  [ 0.0569,  0.0105,  0.0158,  0.1300, -0.1367, -0.0207, -0.0514, -0.0629,  0.2029,  0.1042]]], grad_fn=<TransposeBackward0>)
            
hn = tensor([[[-0.1933, -0.0058, -0.1237,  0.0348, -0.1394,  0.2403,  0.1591, -0.1143,  0.1211, -0.1971],
              [-0.2387,  0.0433, -0.0296,  0.0877, -0.1198,  0.1919,  0.0832, 0.0738,  0.1907, -0.1807],
              [-0.2174,  0.0721, -0.0447,  0.1081, -0.0520,  0.2519,  0.4040, -0.0033,  0.1378, -0.2930],
              [-0.2130, -0.0404, -0.0588, -0.1346, -0.1865,  0.1032, -0.0269, 0.0265, -0.0664, -0.1800]],

             [[ 0.0993,  0.0160,  0.0516,  0.1402, -0.1146, -0.0177, -0.0607, -0.0715,  0.2110,  0.0954],
              [ 0.0914,  0.0034,  0.0558,  0.1418, -0.1327, -0.0643, -0.0616, -0.0674,  0.2195,  0.0886],
              [ 0.1202, -0.0113,  0.0570,  0.1608, -0.0836, -0.0801, -0.0792, -0.0874,  0.1923,  0.0829],
              [ 0.0569,  0.0105,  0.0158,  0.1300, -0.1367, -0.0207, -0.0514, -0.0629,  0.2029,  0.1042]]], grad_fn=<StackBackward0>)


验证 output[:, -1, :] = hn[-1,:,:]
output[:, -1, :] = tensor([[ 0.0993,  0.0160,  0.0516,  0.1402, -0.1146, -0.0177, -0.0607, -0.0715,0.2110,  0.0954],
                           [ 0.0914,  0.0034,  0.0558,  0.1418, -0.1327, -0.0643, -0.0616, -0.0674,  0.2195,  0.0886],
                           [ 0.1202, -0.0113,  0.0570,  0.1608, -0.0836, -0.0801, -0.0792, -0.0874, 0.1923,  0.0829],
                           [ 0.0569,  0.0105,  0.0158,  0.1300, -0.1367, -0.0207, -0.0514, -0.0629, 0.2029,  0.1042]], grad_fn=<SliceBackward0>)
          
hn[-1,:,:] = tensor([[ 0.0993,  0.0160,  0.0516,  0.1402, -0.1146, -0.0177, -0.0607, -0.0715,0.2110,  0.0954],
                     [ 0.0914,  0.0034,  0.0558,  0.1418, -0.1327, -0.0643, -0.0616, -0.0674,  0.2195,  0.0886],
                     [ 0.1202, -0.0113,  0.0570,  0.1608, -0.0836, -0.0801, -0.0792, -0.0874,  0.1923,  0.0829],
                     [ 0.0569,  0.0105,  0.0158,  0.1300, -0.1367, -0.0207, -0.0514, -0.0629, 0.2029,  0.1042]], grad_fn=<SliceBackward0>)
"""

3. 推荐参考资料

多层 LSTM 的介绍可以参考博客 RNN之多层LSTM理解:输入,输出,时间步,隐藏节点数,层数

RNN 的原理和 PyTorch 源码复现可以参考视频 PyTorch RNN的原理及其手写复现

LSTM 的原理和 PyTorch 源码复现可以参考视频 PyTorch LSTM和LSTMP的原理及其手写复现文章来源地址https://www.toymoban.com/news/detail-530187.html

到了这里,关于【PyTorch API】 nn.RNN 和 nn.LSTM 介绍和代码详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Pytorch 对比TensorFlow 学习:Day 17-18: 循环神经网络(RNN)和LSTM

    Day 17-18: 循环神经网络(RNN)和LSTM 在这两天的学习中,我专注于理解循环神经网络(RNN)和长短期记忆网络(LSTM)的基本概念,并学习了它们在处理序列数据时的应用。 1.RNN和LSTM基础: RNN:了解了RNN是如何处理序列数据的,特别是它的循环结构可以用于处理时间序列或连续

    2024年01月20日
    浏览(50)
  • RNN+LSTM正弦sin信号预测 完整代码数据视频教程

    视频讲解:RNN+LSTM正弦sin信号预测_哔哩哔哩_bilibili 效果演示:  数据展示: 完整代码: 

    2024年02月12日
    浏览(25)
  • 一步一步详解LSTM网络【从RNN到LSTM到GRU等,直至attention】

    本文主要译至Understanding LSTM Networks并加上了部分笔者的见解,对于全面理解LSTM有一定的帮助。 人类不会每一秒都从头开始思考。 当你阅读这篇文章时,你会根据你对前面单词的理解来理解每个单词。 你不会扔掉所有东西,重新开始思考。 你的思想有坚持。Your thoughts have

    2024年02月05日
    浏览(29)
  • Python深度学习026:基于Pytorch的典型循环神经网络模型RNN、LSTM、GRU的公式及简洁案例实现(官方)

    循环神经网络(也有翻译为递归神经网络)最典型的三种网络结构是: RNN(Recurrent Neural Network,循环神经网络) LSTM(Long Short-Term Memory,长短期记忆网络) GRU(Gate Recurrent Unit,门控循环单元) 理解参数的含义非常重要,否则,你不知道准备什么维度的输入数据送入模型 先

    2023年04月22日
    浏览(29)
  • 深度学习RNN,GRU,LSTM文本生成解码器的训练损失讲解(附代码)

    以下以GRU为例讲解RNN作为解码器时如何根据用户、商品特征信息 hidden 生成评价。 解码器部分代码如下: 在训练时,解码器会有两个输入:一是编码器提取的用户、商品特征,二是用户对商品的评价。 评价是文字,在训练开始前已经转换成了Token ID, 比如 I love this item , 每个

    2024年04月12日
    浏览(28)
  • 【Torch API】pytorch 中bincount()函数详解

    torch.bincount 是 PyTorch 中的函数,用于计算给定整数张量中每个值的出现次数。它返回一个张量,其中的每个元素表示输入张量中对应索引值出现的次数。 具体而言, torch.bincount 函数的语法如下: 其中: input 是输入的整数张量,可以是一维或多维的。 weights 是可选的权重张量

    2024年02月11日
    浏览(64)
  • pytorch容器之nn.Sequential, nn.ModuleList, nn.ModuleDict介绍

      在深度学习模型创建的时候,我们经常会碰到 nn.Sequential , nn.ModuleList , nn.ModuleDict 这三个东西,尤其是在迁移学习训练的时候经常碰到,他们到底是什么,怎么用的,使用的时候有哪些注意事项,通过这篇博文浅记一下。   在介绍这三个容器之前,我们需要先知道什么

    2024年02月08日
    浏览(30)
  • 【Torch API】pytorch 中repeat_interleave函数详解

    torch. repeat_interleave ( input ,  repeats ,  dim=None ) → Tensor Repeat elements of a tensor. Parameters input  (Tensor) – the input tensor. repeats  (Tensor  or  int) – The number of repetitions for each element. repeats is broadcasted to fit the shape of the given axis. dim  (int ,  optional ) – The dimension along which to repeat values

    2024年02月11日
    浏览(25)
  • 小白学Pytorch系列--Torch.nn API Vision Layers(15)

    方法 注释 nn.PixelShuffle 将形状张量 ( ∗ , C r 2 , H , W ) (*,C r^2,H,W) ( ∗ , C r 2 , H , W ) 中的元素重新排列为形状张量 ( ∗ , C , H r , W r ) (*,C,H r,W r) ( ∗ , C , Hr , W r ) ,其中r是一个高阶因子。 nn.PixelUnshuffle 通过将形状张量 ( ∗ , C , H r , W r ) (*,C,H r,W r) ( ∗ , C , Hr , W r

    2023年04月22日
    浏览(27)
  • PyTorch中的torch.nn.Linear函数解析

    torch.nn是包含了构筑神经网络结构基本元素的包,在这个包中,可以找到任意的神经网络层。这些神经网络层都是nn.Module这个大类的子类。torch.nn.Linear就是神经网络中的线性层,可以实现形如y=Xweight^T+b的加和功能。 nn.Linear():用于设置网络中的全连接层,需要注意的是全连接

    2024年02月16日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包