前提・実現したいこと
現在Google ColabにてPyTorchを用いてMobileNet V1を実装。
学習データはImageNetのスモールデータセットであるImageNetteを用いる。
このデータセットは
!wget https://s3.amazonaws.com/fast-ai-imageclas/imagenette-320.tgz !tar xzf imagenette-320.tgz
コマンドで取得しColab上から対象のGoogleドライブ内のフォルダにアクセスし読み込んでいる。
ベースとなる学習コードはGitHub上の
https://github.com/Z0m6ie/CIFAR-10_PyTorch
を参考にしている。
このデータセットを用いて学習を行いたい。
発生している問題・エラーメッセージ
99%まで訓練が終わりvalidationを行う際にエラーが発生している模様。
Error
1Requirement already satisfied: tensorboardX in /usr/local/lib/python3.6/dist-packages (2.0) 2Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from tensorboardX) (1.12.0) 3Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from tensorboardX) (1.18.4) 4Requirement already satisfied: protobuf>=3.8.0 in /usr/local/lib/python3.6/dist-packages (from tensorboardX) (3.10.0) 5Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from protobuf>=3.8.0->tensorboardX) (47.1.1) 6--------------------------------------------------------------------------- 7IndexError Traceback (most recent call last) 8<ipython-input-57-8e253ac717c8> in <module>() 9 9 for epoch in range(1): 10 10 train(epoch) 11---> 11 loss, accuracy = validate(epoch) 12 12 best_loss, best_acc = save_best(loss, accuracy, best_loss, best_acc) 13 13 14 155 frames 16/usr/local/lib/python3.6/dist-packages/torchvision/datasets/folder.py in __getitem__(self, index) 17 132 tuple: (sample, target) where target is class_index of the target class. 18 133 """ 19--> 134 path, target = self.samples[index] 20 135 sample = self.loader(path) 21 136 if self.transform is not None: 22 23IndexError: list index out of range
該当のソースコード
以下にノートブック上で学習データの読み込み等を行っている箇所、また、train関数とvalidate関数とそれらの実行を行うソースコードを記す。
なにが原因でこのエラーが起きているのかわからないので原因と解決方法をご教授頂ければ幸いです。
Dataload
1normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], 2 std=[0.229, 0.224, 0.225]) 3 4valid_size=0.1 5 6traindir = 'imagenette-320/train' 7valdir = 'imagenette-320/val' 8 9train_transform = transforms.Compose([ 10 transforms.RandomResizedCrop(224), 11 transforms.RandomHorizontalFlip(), 12 transforms.ToTensor(), 13 normalize 14]) 15 16valid_transform = transforms.Compose([ 17 transforms.Resize(256), 18 transforms.CenterCrop(224), 19 transforms.ToTensor(), 20 normalize 21]) 22train_dataset = datasets.ImageFolder(traindir,transform=train_transform) 23valid_dataset = datasets.ImageFolder(valdir,transform=valid_transform) 24 25num_train = len(train_dataset) 26indices = list(range(num_train)) 27split = int(np.floor(valid_size * num_train)) 28 29 30np.random.seed(42) 31np.random.shuffle(indices) 32 33train_idx, valid_idx = indices[split:], indices[:split] 34 35 36train_sampler = SubsetRandomSampler(train_idx) 37valid_sampler = SubsetRandomSampler(valid_idx) 38 39 40train_loader = torch.utils.data.DataLoader(train_dataset, 41 batch_size=128, sampler=train_sampler) 42 43valid_loader = torch.utils.data.DataLoader(valid_dataset, 44 batch_size=128, sampler=valid_sampler)
Train
1def train(epoch): 2 model.train() 3 writer = SummaryWriter() 4 for batch_idx, (data, target) in enumerate(train_loader): 5 if use_cuda: 6 data, target = data.cuda(), target.cuda() 7 data, target = Variable(data), Variable(target) 8 optimizer.zero_grad() 9 output = model(data) 10 correct = 0 11 pred = output.data.max(1, keepdim=True)[1] # get the index of the max log-probability 12 #print('pred=',pred) 13 correct += pred.eq(target.data.view_as(pred)).sum() 14 loss = criterion(output, target) 15 loss.backward() 16 accuracy = 100 * (int(correct)/ int(len(output))) 17 #print('correct=',correct) 18 #print('len=',len(output)) 19 #print(accuracy) 20 optimizer.step() 21 if batch_idx % 1 == 0: 22 #print('correct=',correct) 23 #print('len=',len(output)) 24 #print(accuracy) 25 print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}, Accuracy: {:.2f}'.format(epoch, batch_idx * len(data), len(train_loader.dataset),100. * batch_idx / len(train_loader), loss.data.item(), accuracy)) 26 writer.add_scalar('Loss/Loss', loss.data.item(), epoch) 27 writer.add_scalar('Accuracy/Accuracy', accuracy, epoch) 28 scheduler.step()
Validate
1def validate(epoch): 2 valid_loss=0.0 3 accuracy=0.0 4 model.eval() 5 6 writer = SummaryWriter() 7 8 valid_loss = 0 9 correct = 0 10 11 for data, target in valid_loader: 12 if use_cuda: 13 data, target = data.cuda(), target.cuda() 14 15 data, target = Variable(data, volatile=True), Variable(target) 16 output = model(data) 17 valid_loss += F.cross_entropy(output, target, size_average=False).data.item() # sum up batch loss 18 pred = output.data.max(1, keepdim=True)[1] # get the index of the max log-probability 19 correct += pred.eq(target.data.view_as(pred)).sum() 20 21 22 valid_loss /= len(valid_idx) 23 accuracy = 100. * correct / len(valid_idx) 24 print('\nValidation set: Average loss: {:.4f}, Accuracy: {}/{} ({:.2f}%)\n'.format( 25 valid_loss, correct, len(valid_idx), 26 100. * correct / len(valid_idx))) 27 writer.add_scalar('Loss/Validation_Loss', valid_loss, epoch) 28 writer.add_scalar('Accuracy/Validation_Accuracy', accuracy, epoch) 29 30 return valid_loss, accuracy
!pip install tensorboardX from tensorboardX import SummaryWriter best_loss = None best_acc = None for epoch in range(1): train(epoch) loss, accuracy = validate(epoch) best_loss, best_acc = save_best(loss, accuracy, best_loss, best_acc)
試したこと
そもそものデータセットの異常を考えましたが、このデータセットを紹介していた
https://qiita.com/sakaia/items/a8d7b08ebce92da1fc14
こちらのページでは問題なく学習が出来ており、私自身もResNetですが同じ手順を踏み学習できました。
どなたかお力添え頂ければ幸いです
補足情報(FW/ツールのバージョンなど)
PyTorchのバージョンは確認したところ
Name: torch Version: 1.5.0+cu101 Summary: Tensors and Dynamic neural networks in Python with strong GPU acceleration Home-page: https://pytorch.org/ Author: PyTorch Team Author-email: packages@pytorch.org License: BSD-3 Location: /usr/local/lib/python3.6/dist-packages Requires: numpy, future Required-by: torchvision, torchtext, fastai
でした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/09 11:56
2020/06/09 12:11 編集
2020/06/09 12:51 編集
2020/06/09 14:20
2020/06/09 14:36
2020/06/09 14:38 編集
2020/06/09 14:52
2020/06/09 14:56