finetune入门,如何用已有的caffem…

调整了N久,终于收敛了,记录一下这段时间的工作。

首先在caffe官网的github上,有个model zoo,里面有很多预训练的模型,这里下载一个VGG_CNN_M_2048的model。然后就把网络复制到本地,这里有个问题,我用vgg网页上附带的网络代码,运行一直没法收敛,换了caffe自带的在路径models/bvlc_reference_caffenet/train_val.prototxt下的这个网络文件(也是从ImageNet改编),调整到对应的网络参数,居然就收敛了。。

准备好网络文件后,就需要做一些细微的调整。首先,因为我们的网络输出是101类(UCF101),所以最后一个全连接层的输出应该改为101,这就带来一个问题,预训练的VGG model最后一层输出是1000,必定会出现参数无法吻合的情况,一般会报如下错:
source param is X X X X(预训练模型的维度),while target param is X X X X(自定义网络的维度)
解决办法是,把这个层作为一个新层训练,新取一个层名即可,加载VGG参数时,如果没遇到对应层名,就会直接跳过。对于新加入的层,一切参数都是随机生成,那么训练幅度肯定要大于其他层,方法就是把全局学习率(base_lr)设置很小,新层的学习率倍数(lr_mult)设置得很大,那么自然其他层都不动,而新层的学习率极高。

在设置好网络之后,我们还需对数据进行预处理,首先要取得均值文件,参考
examples/imagenet/make_imagenet_mean.sh
里面的内容,可自定义自己的均值文件。
准备好均值文件后,在网络的data_layer里面,可以指定我们要做的预处理操作,比如裁剪(crop),镜像反转(mirror),使用之前的均值文件等等

一切准备好之后,我们就能和往常训练一样开始,只是在命令中加一个参数即可:
./build/tools/caffe train -solver mywork/ucf101/vgg_m_2048_solver.prototxt -weights models/VGG_CNN_M_2048/VGG_CNN_M_2048.caffemodel 
用 -weights  告知caffe,预加载已训练好的参数

至此,caffe的finetune方法已经介绍完,最后说一下,尽量不要直接从网上复制网络结构的代码。因为caffe版本不同的网络不一定能复制粘贴,比如旧版的网络层标识是layer s,新版则是layer,而新旧两个标识符不能出现在同一个网络文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值