PyTorch DataLoader返回targets形状异常问题咨询
解决PyTorch DataLoader中Target形状转置的问题
问题根源:你的
__getitem__返回的target是Python列表或numpy数组,而非PyTorch张量。DataLoader默认的collate_fn会对这类可迭代对象按元素位置堆叠——22个长度为4的列表,会被拼成4个长度为22的数组,最终形成len(targets)=4、len(targets[0])=22的结构。快速修复:把
__getitem__里的target转换成PyTorch张量即可。示例代码:
def __getitem__(self, idx): # 生成processed_images的逻辑不变 # 假设原来的target是列表或numpy数组 target = [1, 0, 0, 0] # 你的4维独热向量 # 转换成张量 target_tensor = torch.tensor(target, dtype=torch.float32) return processed_images, target_tensor
这样DataLoader会自动按batch维度堆叠,得到形状为torch.Size([22,4])的target张量。
- 备选方案:自定义collate_fn
如果因为某些原因不能提前转成张量,可以自定义数据拼接函数,强制按样本维度堆叠:
def custom_collate(batch): # 从batch中提取所有图像和target processed_images = torch.stack([sample[0] for sample in batch]) targets = torch.tensor([sample[1] for sample in batch]) return processed_images, targets # 初始化DataLoader时传入自定义collate_fn dataloader = DataLoader(your_dataset, batch_size=22, collate_fn=custom_collate)
内容的提问来源于stack exchange,提问作者Carlo
相关产品推荐
相关产品推荐

