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

- **ID:** `pytorch/torchvision-transforms-pil-error`
- **Domain:** pytorch
- **Category:** type_error
- **Verification:** ai_generated
- **Fix Rate:** 90%

## 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.

## Version Compatibility

| Version | Status | Introduced | Deprecated |
|---------|--------|------------|------------|
| torch>=1.8 | active | — | — |
| torchvision>=0.9 | active | — | — |

## Workarounds

1. **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.** (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.
   ```
2. **If using custom dataset, return PIL images: from PIL import Image; img = Image.open(path).convert('RGB')** (85% success)
   ```
   If using custom dataset, return PIL images: from PIL import Image; img = Image.open(path).convert('RGB')
   ```

## Dead Ends

- **transforms.Compose([transforms.Resize(256), transforms.ToTensor(), transforms.CenterCrop(224)])** — Adding ToTensor() after the transform that expects PIL will still pass a tensor, causing same error. (90% fail)
- **from torchvision.transforms import ToPILImage; img = ToPILImage()(tensor)** — Converting tensor to PIL manually with ToPILImage() but forgetting to import often leads to NameError. (50% fail)
