Ошибка IndexError: индекс 2047 выходит за пределы оси 0 с размером 1638

#deep-learning #pytorch #conv-neural-network

#глубокое обучение #pytorch #conv-нейронная сеть

Вопрос:

Я хочу обучить свой набор данных с помощью обучающих данных и данных проверки. Всего данных — 2048, данных о поездах — 1638, а данных проверки — 410 (20% от общего числа).

Вот мои коды

  1. загрузка данных (org: общие обучающие данные)
      org_x = train_csv.drop(['id', 'digit', 'letter'], axis=1).values
     org_x = org_x.reshape(-1, 28, 28, 1)  
     org_x = org_x/255
     org_x = np.array(org_x)
     org_x = org_x.reshape(-1, 1, 28, 28)
     org_x = torch.Tensor(org_x)
    
     x_test = test_csv.drop(['id','letter'], axis=1).values
     x_test = x_test.reshape(-1, 28, 28, 1)     
     x_test = x_test/255
     x_test = np.array(x_test)
     x_test = x_test.reshape(-1, 1, 28, 28)
     x_test = torch.Tensor(x_test)
    
     y = train_csv['digit']
     y = list(y)
     print(len(y))
     org_y = np.zeros([len(y), 1])
     for i in range(len(y)):
       org_y[i] = y[i]
     org1 = np.array(org_y, dtype=object)  
     
  2. разделение данных (org: общие обучающие данные)
      from sklearn.model_selection import train_test_split
    
     x_train, x_valid, y_train, y_valid = train_test_split(
        org, org1, test_size=0.2, random_state=42)
     
  3. преобразование
      transform = transforms.Compose([transforms.ToPILImage(),
                             transforms.ToTensor(),
                             transforms.Normalize((0.5, ), (0.5, )) ]) 
     
  4. набор данных
      class kmnistDataset(data.Dataset):
     def __init__(self, images, labels=None, transforms=None):
         self.x = images
         self.y = labels
         self.transforms = transforms
    
     def __len__(self):
         return (len(self.x))
    
     def __getitem__(self, idx):
         data = np.asarray(self.x[idx][0:]).astype(np.uint8)
    
         if self.transforms:
             data = self.transforms(data)
    
         if self.y is not None:
             return (data, self.y[i])
         else:
             return data
    
     train_data = kmnistDataset(x_train, y_train, transform)
     valid_data = kmnistDataset(x_valid, y_valid, transform)
    
     train_loader = DataLoader(train_data, batch_size=16, shuffle=True)
     valid_loader = DataLoader(valid_data, batch_size=16, shuffle = False)
     

Я пропущу структуру модели.

  1. обучение (здесь я получил сообщение об ошибке)
     n_epochs = 30
    
    valid_loss_min = np.Inf
    
    for epoch in range(1, n_epochs 1):
        train_loss = 0
        valid_loss = 0
    
    ###################
    # train the model #
    ###################
    model.train()   
    for data in train_loader:
        inputs, labels = data[0], data[1]
        optimizer.zero_grad()
        output = model(inputs)
        loss = criterion(output, labels)
        loss.backward()
        optimizer.step()
        train_loss  = loss.item()*data.size(0)
    
    #####################
    # validate the model#
    #####################
    model.eval()
    for data in valid_loader:
        inputs, labels = data[0], data[1]
        output = model(inputs)
        loss = criterion(output, labels)
        valid_loss  = loss.item()*data.size(0)
    
    
    train_loss = train_loss/ len(train_loader.dataset)
    valid_loss = valid_loss / len(valid_loader.dataset)
    
    print('Epoch: {} tTraining Loss: {:.6f} tValidation Loss: {:.6f}'.format(
        epoch, train_loss, valid_loss))
     

Хотя я проверил размер данных, я получил сообщение об ошибке ниже.

индекс 2047 выходит за рамки для оси 0 с размером 1638

 ---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-42-b8783819421f> in <module>
     11     ###################
     12     model.train()
---> 13     for data in train_loader:
     14         inputs, labels = data[0], data[1]
     15         optimizer.zero_grad()

/opt/anaconda3/lib/python3.7/site-packages/torch/utils/data/dataloader.py in __next__(self)
    433         if self._sampler_iter is None:
    434             self._reset()
--> 435         data = self._next_data()
    436         self._num_yielded  = 1
    437         if self._dataset_kind == _DatasetKind.Iterable and 

/opt/anaconda3/lib/python3.7/site-packages/torch/utils/data/dataloader.py in_next_data(self)
    473     def _next_data(self):
    474         index = self._next_index()  # may raise StopIteration
--> 475         data = self._dataset_fetcher.fetch(index)  # may raise StopIteration
    476         if self._pin_memory:
    477             data = _utils.pin_memory.pin_memory(data)

/opt/anaconda3/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py in fetch(self, 
possibly_batched_index)
     42     def fetch(self, possibly_batched_index):
     43         if self.auto_collation:
---> 44             data = [self.dataset[idx] for idx in possibly_batched_index]
     45         else:
     46             data = self.dataset[possibly_batched_index]

/opt/anaconda3/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py in <listcomp(.0)
     42     def fetch(self, possibly_batched_index):
     43         if self.auto_collation:
---> 44             data = [self.dataset[idx] for idx in possibly_batched_index]
     45         else:
     46             data = self.dataset[possibly_batched_index]

<ipython-input-38-e5c87dd8a7ff> in __getitem__(self, idx)
     17 
     18         if self.y is not None:
---> 19             return (data, self.y[i])
     20         else:
     21             return data

IndexError: index 2047 is out of bounds for axis 0 with size 1638
 

Можете ли вы объяснить, почему и как это решить?

Комментарии:

1. Не могли бы вы распечатать формы x_train и y_train непосредственно перед вызовом `kmnistDataset»?

2. torch.Size([1638, 1, 28, 28]) # печать(x_train.shape) // torch.Size([410, 1, 28, 28]) # print(x_valid.shape) // torch.Size([1638, 1]) # печать(y_train.shape) // torch.Size([410, 1]). # print(y_valid.shape)

Ответ №1:

На первый взгляд, вы используете неправильные формы : org_x = org_x.reshape(-1, 28, 28, 1) . Ось канала, по которой вы являетесь второй (в отличие от TensorFlow), как (batch_size, channels, height, width) :

 org_x = org_x.reshape(-1, 1, 28, 28)
 

То же самое с x_test

 x_test = x_test.reshape(-1, 1, 28, 28)
 

Кроме того, вы получаете доступ к списку вне границ. Вы обратились self.y с i помощью . Мне кажется, вы должны вернуться (data, self.y[idx]) вместо этого.

Комментарии:

1. Спасибо, совершенно не знал об этом. Но та же проблема все еще возникает. 🙁

2. О, большое спасибо. У меня есть еще одна проблема. Могу ли я спросить больше после моих усилий?

3. Если это не слишком далеко от этого сообщения, вы можете спросить здесь. В противном случае вам следует создать еще одно сообщение, я должен быть там, чтобы ответить 😉