SunnyEdward 2022-01-24 16:43 采纳率: 75%
浏览 31
已结题

请问代码第二行是得到了一个什么样的长度呢?为什么要这么取?

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

  • 写回答

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条)

报告相同问题?

问题事件

  • 系统已结题 2月3日
  • 已采纳回答 1月26日
  • 修改了问题 1月24日
  • 创建了问题 1月24日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改