1. ホーム
  2. Deep Learning

Pytorch Deep Learningです。TypeError: 'builtin_function_or_method' object is not iterable エラーの解決方法

2022-02-18 21:12:54

Pytorchを使って画像分類を行う際、このバグに遭遇しました。このコードでもオンラインの例のようにエラーが報告されるので、不思議な感じでした。では、解決策を共有します。

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([
    ToTensor(), # change the pixel to [0, 1.0]
    CenterCrop(224),
    Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
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("number of x_examples:", len(x_train))
print("Number of y_examples:", len(y_train))

エラーはこの行で報告されます(下から3番目)。

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

このコードを何度も確認したりググったりした結果、何も問題はないので、エラーの原因になっているのは、その前のdata_loaderを定義している部分だと判断しました。ウェブ上の動作する他のコードと比較した結果、トランスフォームが問題であることがわかりました。

transform を定義するときは、必ず最初に画像のサイズを変更し、次に ToTensor () を定義してください!

CenterCrop()とToTensor()の順番を調整した修正部分は以下のようになります。

# define the data transform !!! The order of the parameters is important !!! Resize first then ToTensor
data_transform = transforms.Compose([
    Compose([ transforms.CenterCrop(224),
    ToTensor(), # change the pixel to [0, 1.0]
    Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])