質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.60%

IndexError: Target 534 is out of bounds.

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 64

katsumiD

score 0

前提・実現したいこと

自作データセット(1006のクラス、Train=20枚、Test=4枚、32×32のpng画像)を用いて、文字認識をするモデルを作成しようとしていた時に、タイトルのようなエラーがでてしまいました。

発生している問題・エラーメッセージ

IndexError                                Traceback (most recent call last)
<ipython-input-20-02d64264044b> in <module>()
     10         optimizer.zero_grad()
     11         outputs = model(inputs)
---> 12         loss = criterion(outputs, labels)
     13         loss.backward()
     14         optimizer.step()

3 frames
/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
    725             result = self._slow_forward(*input, **kwargs)
    726         else:
--> 727             result = self.forward(*input, **kwargs)
    728         for hook in itertools.chain(
    729                 _global_forward_hooks.values(),

/usr/local/lib/python3.6/dist-packages/torch/nn/modules/loss.py in forward(self, input, target)
    960     def forward(self, input: Tensor, target: Tensor) -> Tensor:
    961         return F.cross_entropy(input, target, weight=self.weight,
--> 962                                ignore_index=self.ignore_index, reduction=self.reduction)
    963 
    964 

/usr/local/lib/python3.6/dist-packages/torch/nn/functional.py in cross_entropy(input, target, weight, size_average, ignore_index, reduce, reduction)
   2466     if size_average is not None or reduce is not None:
   2467         reduction = _Reduction.legacy_get_string(size_average, reduce)
-> 2468     return nll_loss(log_softmax(input, 1), target, weight, None, ignore_index, None, reduction)
   2469 
   2470 

/usr/local/lib/python3.6/dist-packages/torch/nn/functional.py in nll_loss(input, target, weight, size_average, ignore_index, reduce, reduction)
   2262                          .format(input.size(0), target.size(0)))
   2263     if dim == 2:
-> 2264         ret = torch._C._nn.nll_loss(input, target, weight, _Reduction.get_enum(reduction), ignore_index)
   2265     elif dim == 4:
   2266         ret = torch._C._nn.nll_loss2d(input, target, weight, _Reduction.get_enum(reduction), ignore_index)
IndexError: Target 534 is out of bounds.

該当のソースコード

class MyNet(nn.Module):
    def __init__(self):
        super(MyNet, self).__init__()
        self.relu = nn.ReLU()
        self.softmax = nn.Softmax(1)

        self.conv1 = nn.Conv2d(1,16,5)
        self.conv2 = nn.Conv2d(16,32,5)
        self.conv3 = nn.Conv2d(32,64,5)

        self.pool = nn.MaxPool2d(2)

        self.flatten = nn.Flatten()

        self.fc1 = nn.Linear(64 * 1 * 1, 100)
        self.fc2 = nn.Linear(100,10)

    def forward(self, x):
      x = self.conv1(x)
      x = self.relu(x)
      x = self.pool(x)
      x = self.conv2(x)
      x = self.relu(x)
      x = self.pool(x)
      x = self.conv3(x)
      x = self.relu(x)
      x = self.flatten(x)
      x = self.fc1(x)
      x = self.relu(x)
      x = self.fc2(x)
      #x = self.softmax(x)
      return x

args = parse()
phase = 'train' or 'test'
mean = (0.5,)
std  = (0.5,)
transform_dict = {
        'train': transforms.Compose(
            [transforms.Grayscale(),
             transforms.Resize((32,32)),
             #transforms.RandomHorizontalFlip(),
             transforms.ToTensor(),
             transforms.Normalize(mean,std)
             #transforms.Normalize(mean=[0.485, 0.456, 0.406],
                                  #std=[0.229, 0.224, 0.225]),
             ]),
        'test': transforms.Compose(
            [transforms.Grayscale(),
             transforms.Resize((32,32)),
             transforms.ToTensor(),
             transforms.Normalize(mean,std)
            ])}

def prepare_dataset(transform, transform_val, dirname_dataset, dirname_dataset_val):
  dataset = torchvision.datasets.ImageFolder(dirname_dataset, transform)
  dataset_val = torchvision.datasets.ImageFolder(dirname_dataset_val, transform_val)
  print(dataset.class_to_idx)
  print(dataset_val.class_to_idx)
  return dataset, dataset_val

train_data, test_data = prepare_dataset(transform_dict["train"], transform_dict["test"], "/content/drive/MyDrive/Train", "/content/drive/MyDrive/Test")

train_loader = torch.utils.data.DataLoader(train_data, batch_size=args.batchsize, shuffle=True)
val_loader   = torch.utils.data.DataLoader(test_data, batch_size=args.batchsize, shuffle=False)
dataloaders  = {"train":train_loader, "val":val_loader}

model = MyNet()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.0001, momentum=0.9, weight_decay=0.005)

epochs = 2
running_loss = 0.0

for epoch in range(epochs):
    for (inputs, labels) in train_loader:

        # GPUを使用しない場合は削除
        #inputs, labels = inputs.to(device), labels.to(device)

        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()

    print("epoch {}/{}, loss={}".format(epoch + 1, epochs, running_loss / 2000))

試したこと

Targetの作り方に問題があるのかと思い、データセットの作り方を複数試してみましたが、状況は変わらずでした。

補足情報(FW/ツールのバージョンなど)

Python3.6
Pytorch1.7

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る