Deep learning 索引器:索引2047超出大小为1638的轴0的界限
我想用训练数据和验证数据训练我的数据集。 总数据为2048,列车数据为1638,验证数据为410(占总数据的20%) 这是我的密码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
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)
---------------------------------------------------------------------------
索引器回溯(最后一次最近调用)
在里面
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)