pytorch 笔记:PAD_PACKED_SEQUENCE 和PACK_PADDED_SEQUENCE

1 PACK_PADDED_SEQUENCE

1.0 功能

  • 将填充的序列打包成一个更加紧凑的形式
  • 这样RNN、LSTM和GRU等模型可以更高效地处理它们,因为它们可以跳过不必要的计算

1.2 基本使用方法

python 复制代码
torch.nn.utils.rnn.pack_padded_sequence(
    input, 
    lengths, 
    batch_first=False, 
    enforce_sorted=True)

1.3 参数

|----------------|--------------------------------------------------------------------------------------------------------------------------------|
| input | * 一个大小为T×B×*的张量 * T是最长序列的长度 * B是批次大小 * *表示任意数目的维度 |
| lengths | 每个批次元素的序列长度的列表 |
| batch_first | 如果batch_first是True,那么期望的输入格式是B x T x * |
| enforce_sorted | 如果设置了enforce_sorted=True,序列应该按长度降序排列。这意味着input[:,0]应该是最长的序列,input[:,B-1]应该是最短的。 如果enforce_sorted设置为False,输入序列将无条件地被排序。 |

1.4 举例

python 复制代码
import torch
from torch.nn.utils.rnn import pack_padded_sequence

# 输入序列
input_seq = torch.tensor([[6, 8, 9, 0], [5, 7, 0, 0], [1, 0, 0, 0]])

# 序列的实际长度
lengths = [3, 2, 1]

# 使用pack_padded_sequence
packed = pack_padded_sequence(input_seq, lengths, batch_first=True)

packed
#PackedSequence(data=tensor([6, 5, 1, 8, 7, 9]), batch_sizes=tensor([3, 2, 1]), sorted_indices=None, unsorted_indices=None)

2 pad_packed_sequence

对一个已打包的序列进行解包,这个打包的序列通常是通过pack_padded_sequence函数从一个填充的序列得到的

2.1 基本使用方法

python 复制代码
torch.nn.utils.rnn.pad_packed_sequence(
    sequence, 
    batch_first=False, 
    padding_value=0.0, 
    total_length=None)

2.2 参数说明

|---------------|----------------------------------------------------|
| sequence | 要解包的已打包序列 |
| batch_first | 指示输出的维度顺序。如果为True,输出将为B x T x *格式,否则为T x B x *格式 |
| padding_value | 用于填充的值,通常是0 |
| total_length | 可选的。如果指定,输出序列将被填充到这个长度 |

2.3 举例

还是之前的packed

python 复制代码
from torch.nn.utils.rnn import pad_packed_sequence

pad_packed_sequence(packed)
'''
(tensor([[6, 5, 1],
         [8, 7, 0],
         [9, 0, 0]]),
 tensor([3, 2, 1]))
'''

pad_packed_sequence(packed, batch_first=True,total_length=5)
'''
(tensor([[6, 8, 9, 0, 0],
         [5, 7, 0, 0, 0],
         [1, 0, 0, 0, 0]]),
 tensor([3, 2, 1]))
'''
相关推荐
序属秋秋秋1 小时前
《C++初阶之内存管理》【内存分布 + operator new/delete + 定位new】
开发语言·c++·笔记·学习
quant_19863 小时前
R语言如何接入实时行情接口
开发语言·经验分享·笔记·python·websocket·金融·r语言
杨小扩5 小时前
第4章:实战项目一 打造你的第一个AI知识库问答机器人 (RAG)
人工智能·机器人
whaosoft-1435 小时前
51c~目标检测~合集4
人工智能
雪兽软件5 小时前
2025 年网络安全与人工智能发展趋势
人工智能·安全·web安全
元宇宙时间6 小时前
全球发展币GDEV:从中国出发,走向全球的数字发展合作蓝图
大数据·人工智能·去中心化·区块链
小黄人20256 小时前
自动驾驶安全技术的演进与NVIDIA的创新实践
人工智能·安全·自动驾驶
ZStack开发者社区7 小时前
首批 | 云轴科技ZStack加入施耐德电气技术本地化创新生态
人工智能·科技·云计算
宝山哥哥8 小时前
网络信息安全学习笔记1----------网络信息安全概述
网络·笔记·学习·安全·网络安全
X Y O8 小时前
神经网络初步学习3——数据与损失
人工智能·神经网络·学习