Deep learning 索引器:索引2047超出大小为1638的轴0的界限

Deep learning 索引器:索引2047超出大小为1638的轴0的界限,deep-learning,pytorch,conv-neural-network,Deep Learning,Pytorch,Conv Neural Network,我想用训练数据和验证数据训练我的数据集。 总数据为2048,列车数据为1638,验证数据为410(占总数据的20%) 这是我的密码 加载数据(组织:总培训数据) 拆分数据(组织:总培训数据) 转化 transform = transforms.Compose([transforms.ToPILImage(), transforms.ToTensor(), transforms.Normali

我想用训练数据和验证数据训练我的数据集。 总数据为2048,列车数据为1638,验证数据为410(占总数据的20%)

这是我的密码

  • 加载数据(组织:总培训数据)

  • 拆分数据(组织:总培训数据)

  • 转化

     transform = transforms.Compose([transforms.ToPILImage(),
                             transforms.ToTensor(),
                             transforms.Normalize((0.5, ), (0.5, )) ]) 
    
  • 数据集

     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)
    
  • 我将跳过模型结构

  • 培训(在这里,我得到了错误信息)

  • 虽然我检查了数据大小,但还是得到了下面的错误消息

    索引2047超出大小为1638的轴0的界限

    ---------------------------------------------------------------------------
    索引器回溯(最后一次最近调用)
    在里面
    11     ###################
    12型列车()
    --->13对于列车装载机中的数据:
    14输入,标签=数据[0],数据[1]
    15优化器0_grad()
    /opt/anaconda3/lib/python3.7/site-packages/torch/utils/data/dataloader.py in\uuuuuuuuu next\uuuuuu(self)
    433如果自取样器为无:
    434自复位()
    -->435数据=self.\u next\u data()
    436自身数量+=1
    437如果self.\u dataset\u kind==\u DatasetKind.Iterable和\
    /opt/anaconda3/lib/python3.7/site-packages/torch/utils/data/dataloader.py in_next_data(self)
    473 def_下一个_数据(自身):
    474 index=self._next_index()#可能会引发停止迭代
    -->475 data=self._dataset_fetcher.fetch(index)#可能引发停止迭代
    476如果自。_引脚_存储器:
    477数据=_utils.pin_内存。pin_内存(数据)
    /opt/anaconda3/lib/python3.7/site-packages/torch/utils/data//u utils/fetch.py in fetch(self,
    可能(批量索引)
    42 def fetch(自身,可能是批处理索引):
    43如果自我自动排序:
    --->44 data=[self.dataset[idx]用于可能的批处理索引中的idx]
    45其他:
    46 data=self.dataset[可能是批处理索引]
    /opt/anaconda3/lib/python3.7/site-packages/torch/utils/data//u utils/fetch.py in 44 data=[self.dataset[idx]用于可能的批处理索引中的idx]
    45其他:
    46 data=self.dataset[可能是批处理索引]
    in _uGetItem_uuu(self,idx)
    17
    18如果self.y不是无:
    --->19返回(数据,self.y[i])
    20其他:
    21返回数据
    索引器:索引2047超出大小为1638的轴0的界限
    

    你能解释一下为什么以及如何解决这个问题吗?

    乍一看,你使用的形状不正确:
    org\u x=org\u x.reformate(-1,28,28,1)
    。通道轴可以是第二个轴(与TensorFlow不同),如
    (批次大小、通道、高度、宽度)

    x_测试相同

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


    此外,您正在访问一个越界列表。您使用
    i
    访问了
    self.y
    。在我看来,您应该返回
    (data,self.y[idx])

    谢谢,我完全不知道。但同样的问题仍然存在(哦,非常感谢。我还有一个问题。在我挣扎之后我能问更多吗?如果离这篇文章不太远,你可以在这里问。否则你应该创建另一篇文章,我应该在那里回复;)你能在调用'kmnistDataset`?torch.Size之前打印出
    x_train
    y_train
    的形状吗([1638,1,28,28]#print(x_train.shape)//火炬尺寸([410,1,28,28])#print(x_valid.shape)//火炬尺寸([1638,1])#print(y_train.shape)//火炬尺寸([410,1])。#print(y#print(y#valid.shape)
     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)
    
    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))
    
    ---------------------------------------------------------------------------
    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
    
    org_x = org_x.reshape(-1, 1, 28, 28)
    
    x_test = x_test.reshape(-1, 1, 28, 28)