代码之家  ›  专栏  ›  技术社区  ›  Hossein

AttributeError:“Image”对象没有属性“new”在尝试使用Pytorchs AlexNet照明预处理时发生

  •  0
  • Hossein  · 技术社区  · 6 年前

    我试着训练我的模特 ImageNet 使用 inception Alexnet 比如预处理。我用过 Fast-ai imagenet training script 提供脚本。 Pytorch 支持 开端 就像预处理,但是 AlexNet s公司 Lighting ,我们必须自己实施:

    __imagenet_pca = {
        'eigval': torch.Tensor([0.2175, 0.0188, 0.0045]),
        'eigvec': torch.Tensor([
            [-0.5675,  0.7192,  0.4009],
            [-0.5808, -0.0045, -0.8140],
            [-0.5836, -0.6948,  0.4203],
        ])
    }
    
    # Lighting data augmentation taken from here - https://github.com/eladhoffer/convNet.pytorch/blob/master/preprocess.py
    class Lighting(object):
        """Lighting noise(AlexNet - style PCA - based noise)"""
    
        def __init__(self, alphastd, eigval, eigvec):
            self.alphastd = alphastd
            self.eigval = eigval
            self.eigvec = eigvec
    
        def __call__(self, img):
            if self.alphastd == 0:
                return img
    
            alpha = img.new().resize_(3).normal_(0, self.alphastd)
            rgb = self.eigvec.type_as(img).clone()\
                .mul(alpha.view(1, 3).expand(3, 3))\
                .mul(self.eigval.view(1, 3).expand(3, 3))\
                .sum(1).squeeze()
            return img.add(rgb.view(3, 1, 1).expand_as(img))
    

    最后使用如下:

    train_tfms = transforms.Compose([
            transforms.RandomResizedCrop(size),
            transforms.RandomHorizontalFlip(),
            transforms.ColorJitter(.4,.4,.4),
            transforms.ToTensor(),
            Lighting(0.1, __imagenet_pca['eigval'], __imagenet_pca['eigvec']),
            normalize,
        ])
        train_dataset = datasets.ImageFolder(traindir, train_tfms)
        train_sampler = (torch.utils.data.distributed.DistributedSampler(train_dataset)
                         if args.distributed else None)
        train_loader = torch.utils.data.DataLoader(
            train_dataset, batch_size=args.batch_size, shuffle=(train_sampler is None),
            num_workers=args.workers, pin_memory=True, sampler=train_sampler)
    

    但是,问题是,每当我运行脚本时,我会得到:

    'AttributeError:'Image'对象没有'new'属性

    抱怨这句话的是:

    alpha = img.new().resize_(3).normal_(0, self.alphastd)

    我不知道为什么会这样。顺便说一下,我用的是Pythorch0.4。

    1 回复  |  直到 6 年前
        1
  •  1
  •   halfer    6 年前

    多亏了@iacolippo的评论,我终于找到了原因!

    与我在这里写的例子不同,在我的实际脚本中,我使用了 transforms.ToTensor() 之后 lighting() 方法。这样做会导致 PIL 作为输入发送的图像 lightining() 它需要一个张量,这就是错误发生的原因。

    所以基本上我在问题中发布的片段是正确的 .ToTensor 必须在打电话之前使用 Lighting() .