pytorch处理不定长序列;实现不定长输入的RNN / LSTM / GRU

PyTorch中使用LSTM处理变长序列 使用LSTM算法处理的序列经常是变长的,这里介绍一下PyTorch框架下使用LSTM模型处理变长序列的方法。需要使用到PyTorch中torch.nn.utils包中的pack_padd 阅读详情
AI摘要

本文介绍了如何在PyTorch中处理可变长序列,特别是使用自定义的CustomRNN类,该类继承自nn.LSTM,并实现了对不同长度序列的支持。通过pack_padded_sequence和pad_packed_sequence函数,模型能够有效地处理非等长序列数据,同时保持正确的顺序。在测试示例中,展示了如何将改进的LSTM模型应用于词向量矩阵,并得到了预期的输出形状。

情景描述

As we all know,RNN循环神经网络(及其改进模型LSTM、GRU)可以处理序列的顺序信息,如人类自然语言。但是在实际场景中,我们常常向模型输入一个批次(batch)的数据,这个批次中的每个序列往往不是等长的。

pytorch提供的模型(nn.RNN,nn.LSTM,nn.GRU)是支持可变长序列的处理的,但条件是传入的数据必须按序列长度排序。本文针对以下两种场景提出解决方法。

  1. 每个样本只有一个序列:(seq,label),其中seq是一个长度不定的序列。则使用pytorch训练时,我们将按列把一个批次的数据输入网络,seq这一列的形状就是(batch_size, seq_len),经过编码层(如word2vec)之后的形状是(batch_size, seq_len, emb_size)。
  2. 情况1的拓展:每个样本有两个(或多个)序列,如(seq1, seq2, label)。这种样本形式在问答系统、推荐系统多见。

通用解决方案

定义CustomRNN类,继承自nn.RNN,nn.LSTM,nn.GRU三者之一。其实就是封装了一下,使用方法与nn.RNN,nn.LSTM,nn.GRU完全相同。

import torch
from torch import nn


class CustomRNN(nn.LSTM):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def forward(self, input, lengths):
        """
        以batch_first=True为例,
        input shape(batch_size, seq_length, input_size)
        lengths shape(batch_size),每个句子的长度,无序

        1. 使用pack_padded_sequence进行打包
          输入:
            lengths只支持放在cpu上运行,不支持cuda
            enforce_sorted默认为True,表示传入的lengths已按从大到小排序
            由于我们传入的初始数据input没有按长度排序,所以设enforce_sorted=False
          输出:
            包

        2. 将包喂入RNN网络
          输入:
            包
          输出:
            result(包)和hn;
            result依然是个打包状态的包
            hn是最后一个单词喂入RNN网络是的输出
            当使用nn.RNN或nn.GRU时,hn是Tensor;使用nn.LSTM时,hn=(h_n, c_n)是一个元组
            注意:无论batch_first为何值,hn形状总是(num_directions * num_layers, batch_size, hidden_size)
            注意:输出hn的batch维度已经恢复为原始输入input的句子顺序

        3.使用pad_packed_sequence对上一步的result解包(即填充0)
          输入:
            total_length参数一般不需要,因为lengths列表中一般含最大值。但分布式训练时是将一个batch切分了,故一定要有!
          输出:
            output和lens
            lens和输入的lengths相等。
            注意:output的形状为(batch_size, seq_length, num_directions * hidden_size)
            注意:output的batch维度已经恢复为元时输入input的句子顺序
        """
        package = nn.utils.rnn.pack_padded_sequence(input, lengths.cpu(), batch_first=self.batch_first, enforce_sorted=False)
        result, hn = super().forward(package)
        output, lens = nn.utils.rnn.pad_packed_sequence(result, batch_first=self.batch_first, total_length=input.shape[self.batch_first])
        return output, hn


# 测试示例
if __name__ == '__main__':
    # 词向量矩阵:10个单词,每个词向量5维
    E = nn.Embedding(10, 5, _weight=torch.arange(50).float().view(10, 5)).cuda()
    # 定义句子
    seqs = torch.LongTensor([
        [8, 9, 0, 0, 0, 0, 0],
        [1, 2, 3, 4, 5, 6, 7],
        [5, 6, 7, 8, 0, 0, 0],
    ]).cuda()
    lens = torch.Tensor([2, 7, 4])  # 每个句子的真实长度
    # 定义网络
    lstm = CustomRNN(input_size=5, hidden_size=8, batch_first=True, num_layers=3, bidirectional=True).cuda()  # 改进的LSTM模型

    x = E(seqs)  # shape(3,7,5)
    out, hn = lstm(x, lens)

    print('RNN output shape:', out.shape)  # out shape(3,7,16)  # 双向LSTM
    if isinstance(hn, tuple):
        print('hn shape', hn[0].shape)
        print('cn shape', hn[1].shape)
    else:
        print('hn shape', hn.shape)

参考资料

RNN 浅谈对RNN网络的理解 1、RNN网络的结构及原理 这是RNN经典网络结构,一句话解释RNN就是一个单元的重复使用, RNN(Recurrent Nerual Network)都在说rnn是在有序数据上执行的解决信息序列问题的。这里的“序列”究竟是神马??在识别一张图片时是怎么工作的??个人理解就是,如果给定一张大小为16*20的图片,在将图片看成序列时,序列的长度为20,每一时刻的... 阅读详情

相关推荐

一些机器学习的问题

前天在复习机器学习的时候,遇到了一些问题,在此写个博客,以供自己日后查看: 1. 什么是layer normalization如今深度学习面临的一个最大挑战就是训练时间太长以及硬件的计算能力有待提升,我们可以有很多种方法加速我们的模型的训练过程,例如购买一个Nvidia Tesla K80,或者购买一个谷歌研发的Tensor Process Unit,或者使用多个机器与显卡构建分布式平台,这

A11021103的博客 940

深度学习06 - LSTM网络-处理可变长序列输入问题

1、问题 RNN的输入是按照批次来进行

weixin_42673117的博客 6225

PyTorch实战(7)——循环神经网络

本节介绍了循环神经网络 (RNN) 及其在序列数据处理中的应用。首先对比了卷积神经网络 (CNN) 与 RNN 的差异,指出 RNN 通过循环连接建模时序依赖关系。随后详细梳理了 RNN 的发展历程,包括基础 RNN、双向 RNN、LSTM、GRU 等变体的结构特点及改进动机,其中 LSTM 通过门控机制解决长程依赖问题,GRU 则进一步简化结构。接着通过 IMDb 情感分析实战,演示了如何使用 PyTorch 实现文本预处理、RNN 模型构建及训练评估流程,最后探讨了注意力机制如何提升 RNN 性能。

盼小辉丶的博客 1万+

循环神经网络(RNN)

1.为什么需要循环神经网络 普通神经网络适合固定长度的数据 对于长度不固定的输入问题,即序列式问题,需要循环神经网络 循环神经网络可以解决的问题: 1对多:输入图片生成不定长的文字描述 多对1:输入不定长的文本分类(文本情感分析) 多对多:机器翻译 实时多对多:视频解说,实时翻译 普通神经网络 1对多多对1多对多实时多对多 ...

gefeng1209的博客 1557

PyTorch序列预测实战:RNN、LSTM、GRU模型构建

本文还有配套的精品资源,点击获取 简介:自然语言处理中的序列预测是关键任务,需要对数据序列建模预测未来元素。本项目通过PyTorch框架,实现三种递归神经网络变体:RNN、LSTM、GRU。这些模型在文本和时间序列数据上表现优异。项目涵盖数据预处理、模型定义、训练过程、评估与验证、测试与应用等关键环节。源代码文件包含了实现这些步骤的详细代码,有助于提升PyTorch技能并深...

weixin_33816734的博客 2726

Fabric学习笔记(一)- Centos 7下的Fabric 2.3.2环境搭建

一、 环境准备 (一)、在VMware Workstation 15 安装一个Centos 7的虚拟环境,切换到图形化界面: 参考文章链接:Centos 7切换图形化界面 其中可能在yum groupinstall "X Window System"时会报错:Cannot find a valid baseurl for repo: base/7/x86_6,参考这篇文章即可:安装图形化界面报错解决 (二)、打开终端,安装所需的库: 切换root用户,输入命令:su root yum更新,输入命令:y

茕夜 2611

Pytorch:RNN、LSTM、GRU、Bi-GRU、Bi-LSTM、梯度消失、梯度爆炸

日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 1. RNN架构解析 1.1 认识RNN模型 学习目标: 了解什么是RNN模型. 了解RNN模型的作用. 了解RNN模型的分类. 什么是RNN模型: RNN(Recurrent Neural Network), 中文称作循环神...

あずにゃん梓喵的博客 1万+

UNext:基于 MLP 的快速医学图像分割网络

有代码,可深入学习轻量级分割模型的论文切入点 UNet 及其最新扩展(如 TransUNet)近年来一直是领先的医学图像分割方法。然而,这些网络无法有效地用于应用中的快速图像分割,因为它们参数繁重、计算复杂且使用缓慢。为此,我们提出了 UNeXt,它是一种基于卷积多层感知器(MLP)的图像分割网络。我们以有效的方式设计了 UNeXt,其中包括早期卷积阶段和潜在阶段的 MLP 阶段。我们提出了一个标记化的 MLP 块,我们可以在其中有效地标记和投影卷积特征,并使用 MLP 来对表示进行建模。

Philo的博客 3942

RNN 、LSTM、 GRU、Bi-LSTM 等常见循环网络结构以及其Pytorch实现

这篇文章主要是对之前一段时间里接触到的 循环神经网络 的相关知识进行一些总结,包括个人觉得初学难理解或者需要注意的问题和如何使用Pytorch的相关函数。由于这些经典结构网上资料很多,所以一些通识不再陈述,偏重代码部分。 文章目录1.RNN2.LSTM3. GRU4. Multi-Layers-LSTM4. Bi-LSTM5.参考 1.RNN 很多问题都归结于序列信息的处理,例如 speech r...

MirrorN的博客 9448

Dify平台+Excel批量分析实战:5分钟搞定大模型数据处理(附完整代码)

本文详细介绍了如何利用Dify平台的数据集功能,结合Excel和Python脚本,快速构建大模型批量数据处理流水线。通过实战案例演示,读者可在5分钟内完成客户反馈情感分析、产品文案生成等任务,实现从原始数据到结构化洞察的高效转化,极大提升工作效率。

3a9bq4r8t2y的博客 316

MLC-LLM框架在安卓设备上的模型编译与部署全流程解析

本文详细解析了如何利用MLC-LLM框架在安卓设备上编译与部署大语言模型。从环境搭建、模型获取与量化编译,到最终的安卓应用打包与调试,提供了完整的实战流程。重点介绍了如何通过MLC-LLM将大型模型优化为适合移动端运行的格式,实现本地、低延迟、隐私安全的AI应用部署。

weixin_29251337的博客 475

循环神经网络(RNN)与长短时记忆网络(LSTM):序列数据处理实战

摘要:本文系统介绍了循环神经网络(RNN)和长短时记忆网络(LSTM)的原理与应用。RNN通过隐藏状态捕捉序列数据的上下文依赖,但存在梯度消失问题。LSTM创新性地引入门控机制(遗忘门、输入门、输出门)和细胞状态,有效解决了长序列依赖问题。文章详细解析了RNN和LSTM的数学原理,并通过PyTorch实现了字符级文本生成的RNN模型。对比分析表明,LSTM在长序列任务中表现更优,已成为序列处理的主流模型。实战部分展示了如何利用PyTorch构建RNN和LSTM模型,为序列任务开发提供指导。

今天比昨天更努力一点! 1万+

UE5新手必看:如何用蓝图系统快速打造赛车游戏(含Chaos Physics配置)

本文为UE5新手提供使用蓝图系统快速打造赛车游戏的完整指南,涵盖Chaos Physics配置、载具蓝图架构设计、控制逻辑实现等关键步骤。通过详细的实战案例和优化技巧,帮助开发者高效构建具备专业物理反馈的赛车游戏原型。

weixin_29001327的博客 387

NLP学习—10.循环神经网络RNN与LSTM、GRU、双向LSTM以及基于PyTorch的代码实现

文章目录一、为什么需要循环神经网络?二、RNN的原理三、RNN的类型四、RNN存在的问题五、LSTM/GRU六、Gated Recurrent Unit—GRU七、BI-LSTM八、Deep-BILSTM 一、为什么需要循环神经网络?   虽然全连接神经网络理论上只要训练数据足够,给定特定的x,就能得到希望的y,但是全连接神经网络只能处理独立的输入,前一个输入和后一个输入是完全没有关系的。针对某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的情况,此时,就需要用到循环神经网络RNN,该

柳杰的博客 4091

CANoe LIN一致性测试之干扰测试Test moudle_LIN Disturbance Block

注意:相邻两个显隐性不同的bit不允许干扰,例如我同时选择bit6和bit7,相邻两个同显隐性的bit允许干扰,例如当我选择bit3和bit4,项,这里我选择ID:为0x2F(PID:0x6F)的frame。需按照具体测试规范实施干扰项,帧头和数据段都可以实现干扰。最近发现一个干扰测试模块,下面是一些具体使用方法。选择干扰项:PID的奇偶校验位(一致性测试干扰测试之手动测试。一个待测试frameD。

yuanyikangkang的博客 3410

48-OpenCVSharp —-Cv2.MatchTemplate() 函数功能(模板匹配)详解

是 OpenCV 中一个常见且简单的模板匹配算法,适用于目标检测和图像识别中的静态场景。它的优点是易于理解和实现,但在面对旋转、尺度变化、复杂背景或光照变化等挑战时,效果可能大打折扣。在这些情况下,结合多尺度图像、特征匹配算法(如 SIFT、SURF、ORB 等)以及深度学习模型可以显著提高匹配的鲁棒性和精度。模板匹配仍然是一个非常基础但强大的工具,适用于一些简单的图像匹配任务。对于更加复杂和动态的图像识别任务,我们通常会使用其他更加复杂的算法或者深度学习模型来处理。

weixin_45590420的博客 4523

[PyTorch] RNN, LSTM, GRU中输入输出维度

本文中的RNN泛指LSTM,GRU等等CNN和RNN中batch_size的默认位置是不同的。 CNN中:batch_size的位置是position 0. RNN中:batch_size的位置是position 1. 1. 在RNN中输入数据格式: 对于最简单的RNN,我们可以使用两种方式来调用torch.nn.RNNCell()。它只接受序列中的单步输入,必须显式的传入隐藏状态。torch.nn.RNN()可以接受一个序列的输入,默认会传入一个全0的隐藏状态,也可以自己申明隐藏状态传入。 1..

sophicchen的专栏 7797

扰动观察法MPPT控制器simulink仿真

最大功率点跟踪(MPPT)控制器对于光伏(PV)系统至关重要,因为它可以确保系统在所有操作条件下都能从光伏阵列中提取最大功率。扰动观察法(P&O)是一种广泛使用的MPPT算法,因为它简单且易于实现。本文介绍了P&O MPPT控制器的Simulink仿真,并分析了其性能。

qq_59747472的博客 318

(PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测

(PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测

KI的博客 5669

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

循环神经网络RNN完全解析:从基础理论到PyTorch实战

在本文中,我们深入探讨了循环神经网络(RNN)及其高级变体,包括长短时记忆网络(LSTM)、门控循环单元(GRU)和双向循环神经网络(Bi-RNN)。文章详细介绍了RNN的基本概念、工作原理和应用场景,同时提供了使用PyTorch构建、训练和评估RNN模型的完整代码指南。

TechLead 2895

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

简单易懂深入PyTorch中RNN、LSTM和GRU使用和理解

RNNBaseRNNLSTMGRU及其对应的单元格版本RNNCellLSTMCellGRUCell。每个类的功能、作用、参数和使用方法都得到了详细的解释和示例代码的支持。从基础的 RNN 架构到更复杂的 LSTM 和 GRU 结构,本文提供了深入了解这些强大的序列模型工具的机会,同时也展示了如何在实际场景中应用这些模型。这些类不仅对于理解序列数据的基本动态至关重要,而且在许多先进的深度学习应用中发挥着核心作用。

CDBmax的博客 3194

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

循环神经网络(RNN)入门指南及代码示例

循环神经网络(Recurrent Neural Network,RNN)是一种擅长处理序列数据的神经网络结构。与传统的前馈神经网络不同,RNN拥有循环连接,可以保留以前的信息,从而在处理时间序列数据、自然语言处理等任务中表现出色。在这篇文章中,我们将详细介绍RNN的基本概念及其变体LSTM和GRU,并通过代码示例展示如何在实践中使用这些模型。

m0_54141558的博客 4086

现代循环神经网络(GRU、LSTM)(Pytorch 14)

现在我们将定义隐状态的初始化函数init_gru_state。定义的nit_rnn_state函数,此函数 返回一个形状为(批量大小,隐藏单元个数)的张量,张量的值全部为零。现在我们准备定义门控循环单元模型,模型的架构与基本的循环神经网络单元是相同的,只是权重更新公式 更为复杂。

March_A的博客 1969

RNN、LSTM、GRU序列模型对比

AI有温度立志将每一个知识点讲精讲细,帮助您利用碎片时间快速学习、查漏补缺,成为您的AI口袋学习书。

Antai_ZHU的博客 2560

【PyTorch】RNN/LSTM/GRU 计算过程、参数以及使用

从基本 RNN 单元到 LSTM 单元再到 GRU 单元

Esperanto.的博客 3691

RNN、LSTM、GRU汇总

RNN、LSTM、GRU汇总

weixin_44986037的博客 2287
上一篇: 西电学生邮箱 关闭(禁用)网关拦截功能(自动拦截垃圾邮件功能)
下一篇: python多线程是假的!速度慢!效率低下!不升反降!
雪的期许
博客等级 码龄10年 893粉丝 413原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪的期许

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值