pack_padded_sequence,pad_packed_sequence
pack_padded_sequence:
我们正常传进RNN模型的是一个被填充之后的序列矩阵。但是这样pad会影响模型的效果,所以要把pad删除再传进模型。
pack_padded_sequence就是起这个功能的。
pack之后,原来填充的 PAD占位符被删掉了。
输入的形状可以是(T×B×* )。T是最长序列长度,B是batch size,*代表任意维度(可以是0)。如果batch_first=True的话,那么相应的 input size 就是 (B×T×*) 。
enforce_sorted默认是True,被处理的序列要求按序列长度降序排序。如果是False则没有要求。
lengths里的长度要对应于batch_size。
import torch
import torch.nn.utils.rnn as rnn
a = [[1,2,2,4,5],[2,2,1,3,0],[1,6,5,0,0],[1,0,0,0,0]]
a = torch.tensor(a)
# 长度降序
lenths = [5,4,3,1]
pack = rnn.pack_padded_sequence(a,lenths,batch_first=True)
print(pack)
print(pack.data)PackedSequence(data=tensor([1, 2, 1, 1, 2, 2, 6, 2, 1, 5, 4, 3, 5]), batch_sizes=tensor([4, 3, 3, 2, 1]), sorted_indices=None, unsorted_indices=None)
tensor([1, 2, 1, 1, 2, 2, 6, 2, 1, 5, 4, 3, 5])
import torch
import torch.nn.utils.rnn as rnn
a = [[1,0,0,0,0],[1,2,2,4,5],[2,2,1,3,0],[1,6,5,0,0]]
a = torch.tensor(a)
# 长度没有顺序,再没设置enfore_sort参数时会报错。
lenths = [1,4,3,5]
pack = rnn.pack_padded_sequence(a,lenths,batch_first=True)
print(pack)
print(pack.data)RuntimeError: `lengths` array must be sorted in decreasing order when `enforce_sorted` is True. You can pass `enforce_sorted=False` to pack_padded_sequence and/or pack_sequence to sidestep this requirement if you do not need ONNX exportability.import torch
import torch.nn.utils.rnn as rnn
# a = [[1,2,2,4,5],[2,2,1,3,0],[1,6,5,0,0],[1,0,0,0,0]]
a = [[1,0,0,0,0],[1,2,2,4,5],[2,2,1,3,0],[1,6,5,0,0]]
a = torch.tensor(a)
lenths = [1,5,4,3]
# 设置enforce_sorted=False
pack = rnn.pack_padded_sequence(a,lenths,batch_first=True,enforce_sorted=False)
print(pack)
print(pack.data)# 得出的结果和排序好的是一样的
PackedSequence(data=tensor([1, 2, 1, 1, 2, 2, 6, 2, 1, 5, 4, 3, 5]), batch_sizes=tensor([4, 3, 3, 2, 1]), sorted_indices=tensor([1, 2, 3, 0]), unsorted_indices=tensor([3, 0, 1, 2]))
tensor([1, 2, 1, 1, 2, 2, 6, 2, 1, 5, 4, 3, 5])
pad_packed_sequence:
上面提到的函数的功能是将一个填充后的变长序列压紧。 这个操作和pack_padded_sequence()是相反的。把压紧的序列再填充回来。填充时会初始化为0。
返回的Varaible的值的size是 T×B×*, T 是最长序列的长度,B 是 batch_size,如果 batch_first=True,那么返回值是B×T×*。
Batch中的元素将会以它们长度的逆序排列。
参数说明:
sequence (PackedSequence) – 将要被填充的 batch
batch_first (bool, optional) – 如果为True,返回的数据的格式为 B×T×*。
返回值: 一个tuple,包含被填充后的序列,和batch中序列的长度列表
tensor经过pack_padded_sequence之后,看似数据都连接在一起,但是传入模型的是PackedSequence。模型仍然会并行计算得到结果的。
import torch
import torch.nn as nn
import torch.nn.utils.rnn as rnn
a = [[1,0,0,0,0],[1,1,2,4,5],[2,2,1,3,0],[1,6,5,0,0]]
# a经过pack_padded_sequence后,降低一个维度。如果不在最后面加上一维,pack_padded_sequence后就变成一维张量,传不进模型。
# tensor要是浮点型
a = torch.tensor(a).view(4,5,1).float()
# print(a.size())
lenths = [1,5,4,3]
pack = rnn.pack_padded_sequence(a,lenths,batch_first=True,enforce_sorted=False)
print(pack.data)
RNN = nn.RNN(1,1,batch_first=True)
out,hi = RNN(pack)
# 输出也是PackedSequence
print(out)out = rnn.pad_packed_sequence(out,batch_first=True)
print(out)tensor([[1.],[2.],[1.],[1.],[1.],[2.],[6.],[2.],[1.],[5.],[4.],[3.],[5.]])PackedSequence(data=tensor([[-0.1629],[ 0.0738],[-0.1629],[-0.1629],[-0.2759],[ 0.1272],[ 0.7204],[-0.1267],[-0.0714],[ 0.8655],[ 0.4286],[ 0.2545],[ 0.8012]], grad_fn=<CatBackward>), batch_sizes=tensor([4, 3, 3, 2, 1]), sorted_indices=tensor([1, 2, 3, 0]), unsorted_indices=tensor([3, 0, 1, 2]))(tensor([[[-0.1629],[ 0.0000],[ 0.0000],[ 0.0000],[ 0.0000]],[[-0.1629],[-0.2759],[-0.1267],[ 0.4286],[ 0.8012]],[[ 0.0738],[ 0.1272],[-0.0714],[ 0.2545],[ 0.0000]],[[-0.1629],[ 0.7204],[ 0.8655],[ 0.0000],[ 0.0000]]], grad_fn=<IndexSelectBackward>), tensor([1, 5, 4, 3]))
pack_padded_sequence,pad_packed_sequence相关推荐
- pack_padded_sequence 和 pad_packed_sequence
参考: pytorch中如何处理RNN输入变长序列padding pack_padded_sequence 和 pad_packed_sequence 大佬们写的都非常nice啊
- 通过例子10分钟快速看懂pad_sequence、pack_padded_sequence以及pad_packed_sequence
前言 import torch import torch.nn as nnfrom torch.nn.utils.rnn import pad_sequence from torch.nn.utils ...
- pack_padded_sequence和pad_packed_sequence详解
先提供一个官网解读 https://pytorch.org/docs/1.0.1/nn.html#torch.nn.utils.rnn.pack_padded_sequence 在使用深度学习特别是L ...
- Pytorch使用实践,教程,库,调优,计算量,模型搭建
参考文章: PyTorch官方教程中文版 http://pytorch123.com/ pytorch handbook是一本开源的书籍,目标是帮助那些希望和使用PyTorch进行深度学习开发和研究的 ...
- 遇见OFFER,阿里云最强技术团队现身招聘,“职”为你来
简历投递入口: https://bss.csdn.net/delivery/resume/ali 在5·15 遇见OFFER大厂梦招聘活动中,近20家企业来到CSDN[遇见OFFER]直播招聘栏目,其 ...
- 【10w字】超详细【百分百拿offer】的面试教程,集合5000多家软件测试公司面试题。
一.引言 1.1 文档目的 [百分百解决在面试中遇到的些问题] 1.2 背景 此文档历经1年的时间,基本概括了深圳与广州,上干家公司的面试问题并结合基本盖了,95%以上的面试问题,文章内容比较多耐心看 ...
- 想找工作,这一篇15w字数+的文章帮你解决
文章目录 前言 一 专业技能 1. 熟悉GoLang语言 1.1 Slice 1.2 Map 1.3 Channel 1.4 Goroutine 1.5 GMP调度 1.6 垃圾回收机制 1.7 其他 ...
- evaluate函数使用无效_使用Keras和Pytorch处理RNN变长序列输入的方法总结
最近在使用Keras和Pytorch处理时间序列数据,在变长数据的输入处理上踩了很多坑.一般的通用做法都需要先将一个batch中的所有序列padding到同一长度,然后需要在网络训练时屏蔽掉paddi ...
- NLP中各框架对变长序列的处理全解
©PaperWeekly 原创 · 作者|海晨威 学校|同济大学硕士生 研究方向|自然语言处理 在 NLP 中,文本数据大都是变长的,为了能够做 batch 的训练,需要 padding 到相同的长度 ...
- PyTorch中使用LSTM处理变长序列
使用LSTM算法处理的序列经常是变长的,这里介绍一下PyTorch框架下使用LSTM模型处理变长序列的方法.需要使用到PyTorch中torch.nn.utils包中的pack_padded_sequ ...
最新文章
- Java基础看jvm,JAVA基础知识|java虚拟机(JVM)
- CSS属性中Display与Visibility
- tensorflow安装教程
- linux 命令行编辑常用快捷键
- Bash : test 命令
- ORA-12154/ORA-12560 可以尝试的解决办法
- magento更新产品状态报错
- webflux 对url参数的接收处理
- python标准库sys_Python标准库之Sys模块使用详解
- 小学数学N合一(洛谷P2433题题解,Java语言描述)
- 全国首个园区型绿色能源网一年“减碳”上万吨
- forth day ---内置函数、匿名函数
- Linux检测内存泄露的脚本
- html颜色趋势,展望下一年的网页设计配色趋势
- 二维热传导温度场有限元求解
- 原生js动态添加元素
- 操作系统--虚拟内存
- 需求预测——Gallat: A Spatiotemporal Graph Attention Network for Passenger Demand Prediction
- 浅谈对程序员的认识_8年编程生涯回顾:谈谈我对程序员的理解
- 程序员编程艺术第三十 三十一章 字符串转换成整数,通配符字符串匹配