我目前正在使用 PyTorch 执行对象检测任务,并在训练步骤中遇到“IndexError”。错误信息如下:
IndexError: index 1 is out of bounds for dimension 0 with size 1
为了提供一些上下文,我有一个数据加载器,用于加载图像及其相应的目标,其中包括边界框和标签。当我打印第一批时,数据加载器正在生成以下输出:
print(next(iter(data_loader_train)))
out:
((<PIL.Image.Image image mode=RGB size=640x640 at 0x7BE2368E08E0>, <PIL.Image.Image image mode=RGB size=640x640 at 0x7BE2368E07F0>), ({'boxes': tensor([[ 51., 347., 73., 358.],
[183., 340., 210., 349.],
[409., 324., 436., 336.],
[356., 298., 365., 302.],
[396., 289., 403., 293.]]), 'labels': tensor([0]), 'image_id': tensor([160]), 'area': tensor([242., 243., 324., 36., 28.])}, {'boxes': tensor([[141., 339., 186., 357.],
[420., 255., 430., 258.],
[361., 257., 373., 261.]]), 'labels': tensor([0]), 'image_id': tensor([167]), 'area': tensor([810., 30., 48.])}))
这是我的训练循环:
def train_one_epoch(model, optimizer, data_loader, device):
model.train()
total_loss = 0
for images, targets in data_loader:
images = list(transform(image).to(device) for image in images)
targets = [{k: v.to(device) for k, v in t.items()} for t in targets]
loss_dict = model(images, targets)
losses = sum(loss for loss in loss_dict.values())
total_loss += losses
optimizer.zero_grad()
losses.backward()
optimizer.step()
return total_loss / data_loader.__len__()
# let's train it for 10 epochs
num_epochs = 10
for epoch in range(num_epochs):
# train for one epoch, printing every 10 iterations
loss = train_one_epoch(model, optimizer, data_loader_train, device)
# update the learning rate
print('epoch [{}]: \t lr: {} \t loss: {} '.format(epoch, lr_scheduler.get_lr(), loss))
lr_scheduler.step()
当尝试访问超出范围的索引时,torchvision 模型的“roi_heads.py”中的“assign_targets_to_proposals”方法中会出现错误。
我已经验证了数据加载过程并检查了边界框和标签的尺寸。我还尝试在代码中的各个点打印张量,看看是否存在任何差异。但是,我在数据中找不到任何明显的问题。
我希望训练过程能够顺利进行,不会出现任何错误。应正确加载数据,并且应针对指定的时期数对模型进行训练。
我不确定为什么会发生此错误,如果您能提供有关如何解决此错误的见解或建议,我将不胜感激。谢谢!
我在模型训练期间遇到了同样的错误,并重塑我的数据修复了它。
y = df.iloc[:,-1].values.reshape(-1, 1)
更改值以适合您的数据。