Я преобразовал тензор Pytorch размером torch.Size([3, 28, 28])
в массив с размером (28, 28, 3)
, и, похоже, с этим проблем не возникает.Затем я пытаюсь преобразовать это в изображение PIL, используя img = Image.fromarray(img.astype('uint8'), mode='RGB')
, но размеры возвращаемого img
равны (28, 28)
, когда я ожидаю, что оно будет (28, 28, 3)
(или (3, 28, 28)
).Я не могу понять, почему это так.Я позаботился о том, чтобы конвертировать в uint8 и использовать режим RGB, как предлагали другие постеры онлайн, однако ни один из них (ни использование np.ascontiguousarray ) не помогло.
PIL версия 1.1.7
# This code implements the __getitem__ function for a child class of datasets.MNIST in pytorch
# https://pytorch.org/docs/stable/_modules/torchvision/datasets/mnist.html#MNIST
img, label = self.data[index], self.targets[index]
assert img.shape == (3, 28, 28), \
(f'[Before PIL] Incorrect image shape: expecting (3, 28, 28),'
f'received {img.shape}')
print('Before reshape:', img.shape) # torch.Size([3, 28, 28])
img = img.numpy().reshape(3, 28, 28)
img = np.stack([img[0,:,:], img[1,:,:], img[2,:,:]], axis=2)
print('After reshape:', img.shape) # (28, 28, 3)
# doing this so that it is consistent with all other datasets
# to return a PIL Image
img = Image.fromarray(img.astype('uint8'), mode='RGB') # Returns 28 x 28 image
assert img.size == (3, 28, 28), \
(f'[Before Transform] Incorrect image shape: expecting (3, 28, 28), '
f'received {img.size}')
РЕДАКТИРОВАТЬ: Вот минимальный пример.Я оставлю вышеизложенное для контекста, если это вообще поможет.
from PIL import Image
import numpy as np
img = np.random.randn(28, 28, 3)
img = Image.fromarray(img.astype('uint8'), mode='RGB') # Returns 28 x 28 image
assert img.size == (28, 28, 3), \
(f'[Before Transform] Incorrect image shape: expecting (3, 28, 28), '
f'received {img.size}')
AssertionError: [Before Transform] Incorrect image shape: expecting (3, 28, 28), received (28, 28)