Pytorch:尝试将变换应用于numpy数组......失败并出现错误

时间:2017-10-05 13:16:39

标签: numpy pytorch

任何帮助将不胜感激。 transforms.py中的代码表示转换应该/将应用于PIL图像以及ndarrays。 鉴于转型:

data_transforms = {
    'train': transforms.Compose([
        transforms.Scale(256),
        transforms.Pad(4,0),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
    'val': transforms.Compose([
        transforms.Scale(256),
        transforms.Pad(4,0),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
}

我希望将转换应用于我从其他代码中获得的ndarrays。让我们说它是x_data,其形状为(1000,120,160,3),其中尺寸为(总行数,宽度,高度,通道)

执行以下操作失败(我尝试做的只是应用转换):

foo = data_transforms['train']
bar = foo(x_data[0])

带有以下消息:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-93-a703e3b9c76d> in <module>()
----> 1 foo(x_data[1])

~/anaconda3/envs/pytorch/lib/python3.5/site-packages/torchvision-0.1.9-py3.5.egg/torchvision/transforms.py in __call__(self, img)
     32     def __call__(self, img):
     33         for t in self.transforms:
---> 34             img = t(img)
     35         return img
     36 

~/anaconda3/envs/pytorch/lib/python3.5/site-packages/torchvision-0.1.9-py3.5.egg/torchvision/transforms.py in __call__(self, img)
    185         """
    186         if isinstance(self.size, int):
--> 187             w, h = img.size
    188             if (w <= h and w == self.size) or (h <= w and h == self.size):
    189                 return img

TypeError: 'int' object is not iterable

2 个答案:

答案 0 :(得分:1)

大多数变换方法仅将PIL对象作为输入。但是你可以添加另一个名为transforms.ToPILImage()的变换,它将nd数组作为输入,将nd数组转换为PIL对象。所以在你的情况下,字典变量应该变成:

data_transforms = {
'train': transforms.Compose([
    transforms.ToPILImage()
    transforms.Scale(256),
    transforms.Pad(4,0),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
'val': transforms.Compose([
    transforms.Scale(256),
    transforms.Pad(4,0),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
}

请注意,这些转换是按顺序进行的。因此,有必要将toPILImage转换添加为第一个转换。因此,您的nd-array首先转换为PIL对象,然后应用其他转换。

答案 1 :(得分:0)

我认为你不能在numpy数组上应用转换。 Scale(现在调整大小)适用于PIL Image,类似于许多其他转换。

源代码很容易理解,请看:https://github.com/pytorch/vision/blob/master/torchvision/transforms.py