前言
最近在做FCN语义分割方面的项目,在finetune的时候遇到了训练loss不下降的情况,在经过自己的摸索之后,最后loss曲线下降下去,这里将这个过程记录下来,希望对大家有所帮助。
1. 数据集问题
数据集的问题在按照自己的需求进行语义分割的时候都会遇到。其实数据集的制作很简单,只需要按照自己的需求设计好分类就行了,可以参考本人之前的博客进行修改。需要提醒的是每个0~255的像素值代表的是一个分类,灰度图像就有256个分类。
在进行训练自己数据的时候,分类数目和Github上下载下的文件里面定义的不一样,这里就需要在train.prototxt和val.prototxt文件中将num_output: 21改为num_output: +自己的分类数目。也可以通过train.prototxt中删除Data层Loss层得到网络的定义文件deploy.prototxt
2. 基础学习率问题
博主在进行训练自己的数据的时候在开始进行训练的时候设置的base_lr为1e-4,结果发现loss曲线就是从开始到结束的一条直线,根本没有丝毫的下降,但是将base_lr设置为1e-10的时候loss就下降很快了-_-||
3. 网络权重初始化问题
这是原来调用训练好的模型进行finretune的代码
solver = caffe.SGDSolver('solver.prototxt')
solver.net.copy_from(weights)
要将其改成
solver = caffe.SGDSolver('solver.prototxt')
# 这里开始的3行都是我们需要增加的
vgg_net = caffe.Net(vgg_proto,vgg_weights,caffe.TRAIN)
surgery.transplant(solver.net,vgg_net)
del vgg_net
其实它是先把这个权重值放到了VGG16的网络中,就是vgg_net = caffe.Net(vgg_proto, vgg_weights, caffe.TRAIN)这一句话
然后把vgg_net的权值通过一个函数转化到我现在这个solver.ne