如何对YOLO目标检测算法进行迁移学习?含已训练模型调整需求
针对YOLO迁移学习(仅训练最后全连接与Softmax层)的Cfg配置方案
Got it,咱们直接说怎么改配置实现你的需求——复用之前训练好的YOLO权重,只让最后负责分类输出的层参与训练,前面的特征提取层完全冻结不动:
1. 冻结所有前置特征提取层
有两种简单的方式实现冻结,选你顺手的来:
- 全局批量冻结:在你的
[net]配置块的末尾,加上一行:
这里的freeze=XXXX是你要冻结的层数——数一下cfg里从第一个卷积层开始,到最后一个待训练层(就是你设filters=50的卷积层)的前一层,总共有多少层就填多少。这样前面所有层的权重都不会在训练中更新。 - 逐层精准冻结:给每个不需要训练的层(比如所有前置卷积、池化层)的配置末尾,加上:
这个参数会让反向传播时跳过该层,相当于直接冻结权重。stopbackward=1
2. 锁定待训练层的配置
你之前已经把classes设为5、filters设为50,这部分要保留好,同时确保这两个核心层不被冻结:
- 找到你设置
filters=50的那个卷积层(这层对应YOLO的全连接逻辑),不要给它加stopbackward=1,也别包含在freeze的层数里; - 对应的
[yolo]层(包含Softmax分类逻辑),同样要确保它不在冻结范围内,并且classes=5的设置准确,mask参数和你的YOLO结构匹配(如果是单尺度检测的话不用改)。
3. 训练时的小细节
- 启动训练时,指定你之前训练好的权重文件,YOLO会自动加载对应层的预训练权重,冻结的层不会被覆盖;
- 你设置的
learning_rate=0.0001很合适,迁移学习用小学习率能避免破坏预训练的特征。
示例修改后的Cfg片段
假设你的cfg最后几层是这样的,这里只保留最后两个层的训练权限:
# 前面所有层都加上stopbackward=1,比如: [convolutional] batch_normalize=1 filters=256 size=3 stride=1 pad=1 activation=leaky stopbackward=1 # 冻结该层 # ... 中间所有层都按上面的方式加stopbackward=1 ... # 最后一个卷积层,参与训练 [convolutional] batch_normalize=1 filters=50 size=1 stride=1 pad=1 activation=linear # YOLO层,参与训练 [yolo] mask = 6,7,8 anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 classes=5 num=9 jitter=.3 ignore_thresh = .7 truth_thresh = 1 random=0
这样设置后,训练过程中只有最后那个卷积层和YOLO层的权重会被更新,完全符合你要的迁移学习需求~
内容的提问来源于stack exchange,提问作者Erandaka Anupama
相关产品推荐
相关产品推荐

