packed = pack_padded_sequence(x_lstm,#经过填充序列等长的输入数据
x['link_cross_len'].cpu(), #mini-batch中各个序列的实际长度。??
batch_first=True,
enforce_sorted=False)

请问代码第二行是得到了一个什么样的长度呢?为什么要这么取?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- 慷仔 2022-01-24 18:46关注
rnn运行,需要输入一个数据队列,也就是多维度的tensor,而数据队列的长度不一定总是相同的。
比如,你原始的队列数据如下所示:a = torch.tensor([1,2,3,4]) b = torch.tensor([5,6,7]) c = torch.tensor([7,8]) d = torch.tensor([9]) train_x = [a, b, c, d]
那么为了能够让rnn进行训练,我们会用0补齐b,c,d,也就是在末尾增加0,使其长度都是4,对齐长度的数据就是x_lstm了。
然后再送进pack_padded_sequenece()函数,这个函数的第二个参数也就是原始数据的各个队列的相应长度,如下所示:# seq_len就是真实的序列长度 seq_len = [i.shape[0] for i in train_x]
以下是可运行的真实例子:
import torch from torch.utils.data import Dataset, DataLoader from torch.nn.utils.rnn import pad_sequence,pack_padded_sequence,pack_sequence,pad_packed_sequence class MyData(Dataset): def __init__(self, data): self.data = data def __len__(self): return len(self.data) def __getitem__(self, idx): return self.data[idx] # 扩展函数 def collate_fn(data): data.sort(key=lambda x: len(x), reverse=True) data = pad_sequence(data, batch_first=True, padding_value=0) return data a = torch.tensor([1,2,3,4]) b = torch.tensor([5,6,7]) c = torch.tensor([7,8]) d = torch.tensor([9]) train_x = [a, b, c, d] # seq_len就是真实的序列长度 seq_len = [i.shape[0] for i in train_x] data = MyData(train_x) # DataLoader补齐了那些短的队列,用0扩展了。 data_loader = DataLoader(data, batch_size=4, shuffle=False, collate_fn=collate_fn) # 采用默认的 collate_fn 会报错 #data_loader = DataLoader(data, batch_size=2, shuffle=True) batch_x = iter(data_loader).next() # 使用pack_padded_sequence batch_y = pack_padded_sequence(batch_x, seq_len, batch_first=True) print("对应的原始数据长度\n",seq_len) print("扩展后的队列\n",batch_x) print("pack_padded_sequence后的队列\n",batch_y)
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用