PyTorch DataLoader返回列表引发多类错误,求助解决方法
PyTorch DataLoader 视图操作错误解决
问题场景
以下代码运行时,training_sample = training_sample.view(-1, sequenceLength)行触发AttributeError: 'list' object has no attribute 'view':
def Embed(sequenceSet): output = [] for s in sequenceSet: PseDNCSequence = Embedding.PseDNC(str(s)) ANFSequence = Embedding.ANF(str(s)) EIIPSequence = Embedding.EIIP(str(s)) emdbededSequence = PseDNCSequence+ANFSequence+EIIPSequence output.append(emdbededSequence) return np.array(output) text = file.read() lines = text.strip().split('\n') embededS = Embed(lines) embeddedSequences = torch.tensor(embededS) my_dataset = TensorDataset(embeddedSequences) loader = data.DataLoader(my_dataset, batch_size=batch_size, shuffle=True) for epoch in range(num_epochs): for training_sample in loader: training_sample = training_sample.view(-1, sequenceLength) batch_size = training_sample.shape[0] ....
尝试修改为training_sample = torch.tensor(training_sample)后,又触发ValueError: only one element tensors can be converted to Python scalars。
原因分析
TensorDataset用于包装多组张量(比如输入特征与标签),当仅传入单个张量时,DataLoader每次迭代返回的是包含该批次张量的元组(表现为类列表对象),而非直接返回张量。因此直接调用.view()会因对象类型错误失败;而用torch.tensor()转换列表中的张量,会因张量无法直接被转换为Python标量报错。
解决方法
方法1:提取元组中的张量元素
在循环内先取出元组里的张量,再执行视图操作:
for epoch in range(num_epochs): for training_sample in loader: # 提取元组内的批次张量 training_sample = training_sample[0] training_sample = training_sample.view(-1, sequenceLength) batch_size = training_sample.shape[0] ....
方法2:简化数据集构建(可选)
如果仅需处理单张量输入,也可以自定义极简Dataset替代TensorDataset,避免元组包装:
class SingleTensorDataset(Dataset): def __init__(self, tensor): self.tensor = tensor def __len__(self): return len(self.tensor) def __getitem__(self, idx): return self.tensor[idx] # 替换原Dataset构建代码 my_dataset = SingleTensorDataset(embeddedSequences) loader = data.DataLoader(my_dataset, batch_size=batch_size, shuffle=True)
此时循环内可直接对training_sample调用.view()操作。
内容的提问来源于stack exchange,提问作者Peter Phan
相关产品推荐
相关产品推荐

