pytorch type_error ai_generated true

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

ID: pytorch/torchvision-transforms-pil-error

Also available as: JSON · Markdown · 中文
90%Fix Rate
88%Confidence
1Evidence
2023-01-20First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
torch>=1.8 active
torchvision>=0.9 active

Root Cause

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

中文

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

Official Documentation

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

Workarounds

  1. 95% success Ensure ToTensor() is the last transform: transforms.Compose([transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor()]). This converts PIL to tensor after all PIL-based transforms.
    Ensure ToTensor() is the last transform: transforms.Compose([transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor()]). This converts PIL to tensor after all PIL-based transforms.
  2. 85% success If using custom dataset, return PIL images: from PIL import Image; img = Image.open(path).convert('RGB')
    If using custom dataset, return PIL images: from PIL import Image; img = Image.open(path).convert('RGB')

中文步骤

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

Dead Ends

Common approaches that don't work:

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

    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% fail

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