索引应该位于 cpu 上或与索引张量位于同一设备上

Tri*_*ate 8 yolo

我下载了一个为 YoloV7 准备的数据集。我还克隆了 yoloV7 Repo。

我想用这个下载的数据集训练模型,为此我使用这个命令。

python train.py --workers 8 --device 0 --batch-size 16 --data data.yaml --img 640 640 --cfg cfg/training/yolov7.yaml --weights yolov7x.pt --name yolov7 --hyp data/hyp.scratch.p5.yaml
Run Code Online (Sandbox Code Playgroud)

我收到这个运行时错误

autoanchor: Analyzing anchors... anchors/target = 5.50, Best Possible Recall (BPR) = 1.0000
Image sizes 640 train, 640 test
Using 8 dataloader workers
Logging results to runs\train\yolov74
Starting training for 300 epochs...

     Epoch   gpu_mem       box       obj       cls     total    labels  img_size
  0%|                                                                                                                                                                                                               | 0/372 [00:03<?, ?it/s]
Traceback (most recent call last):
  File "D:\projects\yolov7\train.py", line 618, in <module>
    train(hyp, opt, device, tb_writer)
  File "D:\projects\yolov7\train.py", line 363, in train
    loss, loss_items = compute_loss_ota(pred, targets.to(device), imgs)  # loss scaled by batch_size
  File "D:\projects\yolov7\utils\loss.py", line 585, in __call__
    bs, as_, gjs, gis, targets, anchors = self.build_targets(p, targets, imgs)
  File "D:\projects\yolov7\utils\loss.py", line 759, in build_targets
    from_which_layer = from_which_layer[fg_mask_inboxes]
RuntimeError: indices should be either on cpu or on the same device as the indexed tensor (cpu)
Run Code Online (Sandbox Code Playgroud)

我的系统包含 1xCpu、1x Cuda GPU(默认游戏电脑)

小智 28

我相信这是当前实施中的一个错误。您可以通过将utils/loss.py第 685 行更改为来修复它

from_which_layer.append((torch.ones(size=(len(b),)) * i).to('cuda'))
Run Code Online (Sandbox Code Playgroud)

并在 756 之后添加一行以安装fg_mask_inboxes到您的 cuda 设备上:

fg_mask_inboxes = fg_mask_inboxes.to(torch.device('cuda'))
Run Code Online (Sandbox Code Playgroud)

  • 有效!!经过两天的网络搜索...... (2认同)