TypeError: img should be PIL Image. Got <class 'torch.Tensor'>

def make_loader():
    trans = transforms.Compose([transforms.ToTensor(),
                            transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)),
                            transforms.RandomHorizontalFlip(0.5)])
    trainset = torchvision.datasets.ImageFolder(root='/content/drive/My Drive/All Data', transform=trans)
    loader = DataLoader(trainset, batch_size=BATCH_SIZE, shuffle=True)

    return loader
loader = make_loader()
----> 5     for data in loader:
--> 414         raise TypeError('img should be PIL Image. Got {}'.format(type(img)))
TypeError: img should be PIL Image. Got <class 'torch.Tensor'>

So, I modified the code.

But,

def make_loader():
    trans = transforms.Compose([transforms.ToPILImage(),
                            transforms.ToTensor(),
                            transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)),
                            transforms.RandomHorizontalFlip(0.5)])
    trainset = torchvision.datasets.ImageFolder(root='/content/drive/My Drive/All Data', transform=trans)
    loader = DataLoader(trainset, batch_size=BATCH_SIZE, shuffle=True)

    return loader
loader = make_loader()
----> 5     for data in loader:
--> 100         raise TypeError('pic should be Tensor or ndarray. Got {}.'.format(type(pic)))
TypeError: pic should be Tensor or ndarray. Got <class 'PIL.Image.Image'>.

how to solve this problem?
or Let me know if you know a simple way to create a dataloader that randomly reverses images when you call.

Hi,
All classes in transforms except Normalize work on PIL images so you have put below line or similar to it before converting it to tensor using ToTensor. After these transforms call ToTensor and then Normalize.

Solution:

trans = transforms.Compose([transforms.ToPILImage(),
                            transforms.RandomHorizontalFlip(0.5),
                            ...
                            ...
                            transforms.ToTensor(),
                            transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])

Bests

Thank you for the answer.
But, There is still an error.

/usr/local/lib/python3.6/dist-packages/torchvision/transforms/transforms.py in __call__(self, pic)
    125 
    126         """
--> 127         return F.to_pil_image(pic, self.mode)
    128 
    129     def __repr__(self):

--> 100         raise TypeError('pic should be Tensor or ndarray. Got {}.'.format(type(pic)))
TypeError: pic should be Tensor or ndarray. Got <class 'PIL.Image.Image'>.

Original image is PNG file. That’s matter?
I think ImageFolder is the problem.

No, that was my mistake, remove ToPILImage from transfroms list and it will be ok.

The explanation would be that ImageFolder converts to PIL by itself and ToPIL was converting a PIL image to PIL which is wrong as `ToPIL only needs tensor.

1 Like

Oh my god, thanks!! :smiley:

1 Like