pytorch type_error ai_generated true

类型错误:pic应为PIL图像或ndarray。得到<class 'torch.Tensor'>

TypeError: pic should be PIL Image or ndarray. Got <class 'torch.Tensor'>

ID: pytorch/torchvision-transforms-pil-error

其他格式: JSON · Markdown 中文 · English
90%修复率
88%置信度
1证据数
2023-01-20首次发现

版本兼容性

版本状态引入弃用备注
torch>=1.8 active
torchvision>=0.9 active

根因分析

期望PIL图像或numpy数组的torchvision变换接收到了原始torch.Tensor,通常是由于缺少ToTensor()调用或变换顺序错误。

English

A torchvision transform expecting PIL Image or numpy array received a raw torch.Tensor, often due to missing ToTensor() call or wrong transform order.

generic

官方文档

https://pytorch.org/vision/stable/transforms.html

解决方案

  1. 确保ToTensor()是最后一个变换:transforms.Compose([transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor()])。这会在所有基于PIL的变换之后将PIL转换为张量。
  2. 如果使用自定义数据集,返回PIL图像:from PIL import Image; img = Image.open(path).convert('RGB')

无效尝试

常见但无效的做法:

  1. transforms.Compose([transforms.Resize(256), transforms.ToTensor(), transforms.CenterCrop(224)]) 90% 失败

    Adding ToTensor() after the transform that expects PIL will still pass a tensor, causing same error.

  2. from torchvision.transforms import ToPILImage; img = ToPILImage()(tensor) 50% 失败

    Converting tensor to PIL manually with ToPILImage() but forgetting to import often leads to NameError.