怎样用自己的数据集对caffe训练好的model进行fineture?

已邀请:

ruirui_ICT - 听大大们说,要“左手代码,右手公式”,喵~

赞同来自: 辛淼 李扬 chenghao pengpengding pustar lady_he 佛仙魔 AnYunjing Yihsiung更多 »

官方的资料里面已经讲的非常详细了,我再补充几点实际操作时需要注意的地方吧:
1. ImageNet原来是1k个类别,finetune时需要根据自己数据集的类别数重新设置fc8层的output数,且新的fc8层的blob_lr会设的大一些(比如10和20),是为了加快收敛。
2. 自己数据集的类别号从0开始,中间要连续(我师弟有次finetune数据集一直报错,后来发现他是二类分类,但是类别号设成了0和12)
3. 数据集记得打乱,不然很可能不收敛
4. 如果出现不收敛的问题,可以把solver里的lr设的小一点,一般从0.01开始,如果出现loss=nan了就不断往小调整
5. 可以把accuracy和loss的曲线画出来,方便设定stepsize,一般在accuracy和loss都趋于平缓的时候就可以减小lr了

zeakey - please visit my homepage: zhaok.xyz

赞同来自: chenghao lady_he yuanyinlove Yihsiung

再补充一点咯,
如果你的网络中某一层的的参数个数变了,例如 AlexNet全连接层输出为1000个,而你的网络只需要做2分类也就是输出两个值, 那一定要把该层的 name 换一下,不然 caffe 在 finetune 源网络的 weight 的时候发现维度不匹配会报错的.
 
finetune 时caffe 是按 layer_name 来逐层 copy weights 的. 对应的代码在 net.cpp:736 的函数: 
void Net<Dtype>::ShareTrainedLayerWith(const Net* other){}

辛淼 - CaffeCN社区创始人。北航PhD,目前在哈佛大学工作。

赞同来自: chenghao Liubing

官方文档上专门有一章讲如何在Caffe中Fine-tuning,讲的很详细了,请参考:
http://caffe.berkeleyvision.org/gathered/examples/finetune_flickr_style.html
caffe的代码包中也有相应的example
 

qibai

赞同来自: 辛淼 Yihsiung

分享一点实践的小trick吧,
1)在finetune时,因为有一些层是自己随机初始化的,所以很有可能一开始就nan了,这时候你会发现nvidia-smi里面的gpu利用率总会20%,0%,0%,而且迭代会很慢,这时候不用等了,已经nan了
2)还是上面的问题,一开始就nan,这时候可以把lr调小一点,训练一定的迭代后再把lr调大,就可以继续训练了,像faster rcnn的话5000轮后可以增加lr了

starzhou

赞同来自: 爱在路上

其实我们操作起来还是有困难的,能不能给出一个 1. model 2. train_val.photo.txt. 3. solver.txt. 4. test.proto.txt.
让我们早点上手,避免,错了,还以为是对的,对了也不知道为什么对了。黑暗中摸索,太难了。
先谢谢 @ruirui_ICT

爱在路上 - 想成为菜鸟中的战斗机

赞同来自:

大神,finetune时,acc层和loss层有吗?应该怎么设置的??

zhangrui

赞同来自:

大牛们,请问怎么用自己的数据fine-tuning训练好的FCN?官方有相关资料吗?

要回复问题请先登录注册