您的位置:首页 > 其它

欢迎使用CSDN-markdown编辑器

2017-06-09 17:24 218 查看

一、进行fine-tune时需要注意的地方:

ImageNet原来是1k个类别,finetune时需要根据自己数据集的类别数重新设置fc8层的output数,且新的fc8层的blob_lr会设的大一些(比如10和20),是为了加快收敛。

如果你的网络中某一层的的参数个数变了,例如AlexNet全连接层输出为1000个,而你的网络只需要做2分类也就是输出两个值,那一定要把该层的 name 换一下,不然caffe 在 finetune 源网络的weight 的时候发现维度不匹配会报错的。

自己数据集的类别号从0开始,中间要连续(我师弟有次finetune数据集一直报错,后来发现他是二类分类,但是类别号设成了0和12)

数据集记得打乱,不然很可能不收敛,这可以使用文本行打乱小工具。

如果出现不收敛的问题,可以把solver里的lr设的小一点,一般从0.001开始,如果出现loss=nan了就不断往小调整

可以把accuracy和loss的曲线画出来,方便设定stepsize,一般在accuracy和loss都趋于平缓的时候就可以减小lr了

上面的是方法是经过大神们总结的经验,具体可以参考caffe工程examples\finetune_flickr_style里的一个readme.md说明文档。它的那个例子的准确度比较低。不过一般使用到别的比较好的地方则准确率会很高。

其中fine-tune在进行修改输出分类值时一般需要重命名层的名字,否则在加载时会报维度不同的错误。修改后caffe模型会忽略名字不同的层。

caffe的一些知识点

1、caffe在内存上进行的一些操作。其体现在train_val.prototxt文件定义上。其中的一小段代码是:

layer {
name: "relu1"
type: "ReLU"
bottom: "conv1"
top: "conv1"
}
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}


其中的relu1层由于是元素级的操作,其是通过现场本地激活来节省内存,所以其

bottom和top都是“conv1”层。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: