如何将不等长嵌套列表转换为torch.LongTensor?
解决不等长嵌套列表转torch.LongTensor的报错问题
PyTorch的张量要求所有维度的长度必须统一,直接传入不等长的嵌套列表会触发TypeError: not a sequence,因为框架无法推断出规整的张量形状。下面是两种实用的解决方法:
方法一:填充至统一长度(通用场景)
先找出所有子列表里的最长长度,给每个短子列表补占位符(比如0),确保所有子列表长度一致后再转张量:
import torch tmp = [[7, 1], [8, 4, 0], [9]] # 获取最长子列表的长度 max_length = max(len(item) for item in tmp) # 给每个子列表补0到最长长度 padded_list = [item + [0]*(max_length - len(item)) for item in tmp] # 转换为LongTensor result_tensor = torch.LongTensor(padded_list) print(result_tensor)
输出结果:
tensor([[7, 1, 0], [8, 4, 0], [9, 0, 0]])
方法二:使用PackedSequence(序列建模场景)
如果是处理RNN、LSTM这类序列任务,不想用填充浪费计算资源,可以用pack_sequence打包不等长序列,它会保留原始序列长度,只计算有效部分:
import torch from torch.nn.utils.rnn import pack_sequence, pad_packed_sequence tmp = [[7, 1], [8, 4, 0], [9]] # 先把每个子列表转成单个LongTensor single_tensors = [torch.LongTensor(item) for item in tmp] # pack_sequence要求输入按序列长度降序排列 sorted_tensors = sorted(single_tensors, key=lambda x: len(x), reverse=True) # 打包成PackedSequence packed_seq = pack_sequence(sorted_tensors) print(packed_seq) # 如需还原为填充后的张量,可使用pad_packed_sequence padded_tensor, seq_lengths = pad_packed_sequence(packed_seq) print("\n还原后的填充张量:") print(padded_tensor) print("原始序列长度:", seq_lengths)
输出结果:
PackedSequence(data=tensor([8, 7, 9, 4, 1, 0]), batch_sizes=tensor([3, 2, 1]), sorted_indices=None, unsorted_indices=None) 还原后的填充张量: tensor([[8, 7, 9], [4, 1, 0], [0, 0, 0]]) 原始序列长度: tensor([3, 2, 1])
内容的提问来源于stack exchange,提问作者Dang
相关产品推荐
相关产品推荐

