Pytorch:正在尝试将转换应用于numpy数组。。。由于错误而失败

Pytorch:正在尝试将转换应用于numpy数组。。。由于错误而失败,numpy,pytorch,Numpy,Pytorch,任何帮助都将不胜感激。transforms.py中的代码表示,转换应该/将应用于PIL图像以及Ndarray。 给定这些变换: data_transforms = { 'train': transforms.Compose([ transforms.Scale(256), transforms.Pad(4,0), transforms.ToTensor(), transforms.Normalize([0.485, 0.45

任何帮助都将不胜感激。transforms.py中的代码表示,转换应该/将应用于PIL图像以及Ndarray。 给定这些变换:

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])
    ]),
}
我希望将转换应用于从其他代码获得的Ndarray。假设它是x_数据,其形状为(1000120160,3),其中尺寸为(总行、宽度、高度、通道)

执行以下操作失败(我只想应用一个转换):

发出以下信息:

---------------------------------------------------------------------------
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
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
---->1个foo(x_数据[1])
~/anaconda3/envs/pytorch/lib/python3.5/site-packages/torchvision-0.1.9-py3.5.egg/torchvision/transforms.py in\uuuu call\uuuuu(self,img)
32 def呼叫(自我,img):
33对于自转换中的t:
--->34 img=t(img)
35返回img
36
~/anaconda3/envs/pytorch/lib/python3.5/site-packages/torchvision-0.1.9-py3.5.egg/torchvision/transforms.py in\uuuu call\uuuuu(self,img)
185         """
186如果isinstance(self.size,int):
-->187 w,h=img.尺寸

188如果(w我认为你不能在numpy数组上应用转换。Scale(现在调整大小)在PIL图像上的作用与许多其他转换类似


源代码很容易理解,请看这里:

大多数transforms方法仅将PIL对象作为输入。但是您可以添加另一个名为
transforms.topiImage()
的转换,该转换将nd数组作为输入,以将nd数组转换为PIL对象。因此,在您的情况下,dictionary变量应为:

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数组首先转换为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])
]),
}