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相关推荐

  1. pack_padded_sequence 和 pad_packed_sequence

    参考: pytorch中如何处理RNN输入变长序列padding pack_padded_sequence 和 pad_packed_sequence 大佬们写的都非常nice啊

  2. 通过例子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 ...

  3. pack_padded_sequence和pad_packed_sequence详解

    先提供一个官网解读 https://pytorch.org/docs/1.0.1/nn.html#torch.nn.utils.rnn.pack_padded_sequence 在使用深度学习特别是L ...

  4. Pytorch使用实践,教程,库,调优,计算量,模型搭建

    参考文章: PyTorch官方教程中文版 http://pytorch123.com/ pytorch handbook是一本开源的书籍,目标是帮助那些希望和使用PyTorch进行深度学习开发和研究的 ...

  5. 遇见OFFER,阿里云最强技术团队现身招聘,“职”为你来

    简历投递入口: https://bss.csdn.net/delivery/resume/ali 在5·15 遇见OFFER大厂梦招聘活动中,近20家企业来到CSDN[遇见OFFER]直播招聘栏目,其 ...

  6. 【10w字】超详细【百分百拿offer】的面试教程,集合5000多家软件测试公司面试题。

    一.引言 1.1 文档目的 [百分百解决在面试中遇到的些问题] 1.2 背景 此文档历经1年的时间,基本概括了深圳与广州,上干家公司的面试问题并结合基本盖了,95%以上的面试问题,文章内容比较多耐心看 ...

  7. 想找工作,这一篇15w字数+的文章帮你解决

    文章目录 前言 一 专业技能 1. 熟悉GoLang语言 1.1 Slice 1.2 Map 1.3 Channel 1.4 Goroutine 1.5 GMP调度 1.6 垃圾回收机制 1.7 其他 ...

  8. evaluate函数使用无效_使用Keras和Pytorch处理RNN变长序列输入的方法总结

    最近在使用Keras和Pytorch处理时间序列数据,在变长数据的输入处理上踩了很多坑.一般的通用做法都需要先将一个batch中的所有序列padding到同一长度,然后需要在网络训练时屏蔽掉paddi ...

  9. NLP中各框架对变长序列的处理全解

    ©PaperWeekly 原创 · 作者|海晨威 学校|同济大学硕士生 研究方向|自然语言处理 在 NLP 中,文本数据大都是变长的,为了能够做 batch 的训练,需要 padding 到相同的长度 ...

  10. PyTorch中使用LSTM处理变长序列

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

最新文章

  1. Java基础看jvm,JAVA基础知识|java虚拟机(JVM)
  2. CSS属性中Display与Visibility
  3. tensorflow安装教程
  4. linux 命令行编辑常用快捷键
  5. Bash : test 命令
  6. ORA-12154/ORA-12560 可以尝试的解决办法
  7. magento更新产品状态报错
  8. webflux 对url参数的接收处理
  9. python标准库sys_Python标准库之Sys模块使用详解
  10. 小学数学N合一(洛谷P2433题题解,Java语言描述)
  11. 全国首个园区型绿色能源网一年“减碳”上万吨
  12. forth day ---内置函数、匿名函数
  13. Linux检测内存泄露的脚本
  14. html颜色趋势,展望下一年的网页设计配色趋势
  15. 二维热传导温度场有限元求解
  16. 原生js动态添加元素
  17. 操作系统--虚拟内存
  18. 需求预测——Gallat: A Spatiotemporal Graph Attention Network for Passenger Demand Prediction
  19. 浅谈对程序员的认识_8年编程生涯回顾:谈谈我对程序员的理解
  20. 程序员编程艺术第三十 三十一章 字符串转换成整数,通配符字符串匹配

热门文章

  1. java与设计模式-观察者模式
  2. 海洋cms采集后无法播放解决方法
  3. librtmp推流到YouTube失败
  4. Windows 10用户档案无法加载的解决方法
  5. 大湾区国际创客峰会暨MFSZ2021重磅回归!
  6. 一路(16)有你,一起(17)前行
  7. vue项目 微信支付 和 支付宝支付
  8. Python 云标签——玩点浪漫!
  9. ios 描述文件位置
  10. 字节跳动最新开源!java后端工程师简历模板