在用Pytorch做图像分类的时候,遇到了这个BUG,因为这段代码和网上例子一样仍报错,所以很奇怪。现将解决方案记录分享

TypeError: 'builtin_function_or_method' object is not iterable

先贴上我报错部分和相关代码


import torch
import torch.utils.data as Data
import torchvision
from torchvision import transforms, datasets

# hyper parameters
BATCH_SIZE = 8

path = "DogsVSCats"
# define the data transform 
data_transform = transforms.Compose([
    transforms.ToTensor(),  # change the pixel to [0, 1.0]
    transforms.CenterCrop(224),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

# define the data set in dictionary form
image_data = {x:datasets.ImageFolder(root=os.path.join(path, x), transform=data_transform)
              for x in ['train', 'valid']}
# define the data loader
data_loader = {x:Data.DataLoader(dataset=image_data[x], batch_size=BATCH_SIZE, shuffle=True)
               for x in ['train', 'valid']}

# preview a batch of data in data set
# x_example, y_example = next(iter(data_loader['train']))
x_train, y_train = next(iter(data_loader["train"]))
print("x_example个数:", len(x_train))
print("y_example个数:", len(y_train))

报错的是这行(倒数第三行)

x_train, y_train = next(iter(data_loader["train"]))

多次检查和上网查询后认定这段代码应该没有错,所以造成报错的应该是前面定义data_loader相关的部分。和网上一些其他正常的代码比对后发现是transform的问题。

在定义transform时,一定要先调整图片大小,再ToTensor ()!

修改后的部分如下,调整了CenterCrop()和ToTensor()的顺序

# define the data transform !!!参数顺序很重要!!!先调整大小再ToTensor
data_transform = transforms.Compose([
    transforms.CenterCrop(224),
    transforms.ToTensor(),  # change the pixel to [0, 1.0]
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐