caffe学习(五)fine-tuning已有模型到新数据

概述

最近试了一个新的数据集,由于每一类别训练数据较少,算法无法收敛。于是尝试使用fine-tuning,利用已有训练模型权重参数适应到新的数据集。

由于我们新的分类器与之前的分类器都采用googLeNet的框架,只是在最后一层由3000个类别增加到60000类,所以需要更改最后一层的参数,把原来的loss3/classifier层改成新名字loss3/classifier/fn,这样由于在原来的模型中找不到这层的名字,这层在训练的时候会用随机变量赋初始值重新训练。

由于原来模型已经收敛,在fine-tuning时候要把base_lr更新学习率降低,同时增加blobs_lr在新的层上,让其他层的参数在新数据来的时候慢点更新,同时让新的层快速学习。同时stepsize参数也适当减少,从而让学习率下降的更快一些。

具体步骤

数据准备

这个没啥好说的,将新的训练数据分为train和valuation集,然后转换成lmdb格式,然后得到其均值文件,准备完毕。

train_val.prototxt

  • data-layer里的train和test均值文件和训练数据源要设置正确
  • loss1/classifier-layer层的name改为loss1/classifier/fn,top参数loss1/classifier/fn,lr_mult参数乘10倍,由原来的1和2改为10和20,num_output改为60000
  • loss1/loss的softmax层的bottom参数改为loss1/classifier/fn
  • loss1/top-1的accuracy层的bottom参数改为loss1/classifier/fn
  • loss1/top-5的accuracy层的bottom参数改为loss1/classifier/fn
  • 上述4个步骤的参数修改同时也要应用到loss2和loss3层中

solver.prototxt

  • test_initialization这句屏蔽掉
  • gamma改为0.1
  • weight_decay改为0.0005
  • base_lr参数降低10倍,改为0.001,这个改动最为重要

deploy.prototxt

  • loss3/classifier-layer层的name改为loss1/classifier/fn,top参数loss1/classifier/fn,lr_mult参数乘10倍,由原来的1和2改为10和20,num_output改为60000
  • prob的softmax层的bottom参数改为loss1/classifier/fn

调用接口

../../build/tools/caffe train --solver=solver.prototxt -weights sku3081_googlenet_quick_iter_900000.caffemodel -gpu 2