为什么 yolo4 pytorch 再训练损失看起来像第一次训练一样高?

数据挖掘 深度学习 火炬 物体检测 python-3.x 约洛
2022-02-14 15:34:32

我通过克隆 git clone 在 google colab 中设置了一个 yolo4 pytorch 框架https://github.com/roboflow-ai/pytorch-YOLOv4.git

我通过培训生成了检查点。由于我们需要更强大的训练模型,我再次通过分配预训练的检查点进行训练,但似乎损失开始于高价值,就像第一次训练一样。

代码用于训练!python train.py -b 2 -s 1 -l 0.001 -g 0 -pretrained ./Yolov4_epoch100_latest.pth -classes 1 -dir ./train -epochs 100

不确定我的预训练检查点是否用于 2end 训练?如果使用它,为什么第二次开始训练的损失值看起来像第一次训练一样高?如果您有任何想法,请分享您的想法

1个回答

显然,只有预训练模型的较低层权重正在更新。更改它打开 models.py 并向下滚动到 Yolov4 的类定义。正如我们所看到的,只有 down1-down5 和颈部层被预训练的模型权重更新,而头部开始新鲜。您应该将此代码部分更改为类似于:

if yolov4conv137weight:
        self.neck = Neck()
        **self.head = Yolov4Head(output_ch)**
        _model = nn.Sequential(self.down1, self.down2, self.down3, self.down4, self.down5, self.neck, **self.head**)
        pretrained_dict = torch.load(yolov4conv137weight)

        model_dict = _model.state_dict()
        # 1. filter out unnecessary keys
        pretrained_dict = {k1: v for (k, v), k1 in zip(pretrained_dict.items(), model_dict)}
        # 2. overwrite entries in the existing state dict
        #print("update weights")
        model_dict.update(pretrained_dict)
        _model.load_state_dict(model_dict)
    # head
    **else:
        self.head = Yolov4Head(output_ch)**

再次运行并观察预期的损失(希望如此)。祝你好运!