caffe训练和测试注意点

训练和测试注意的点: 

1、在train.prototxt文件中权重和偏置项需要初始化,否则可能出现loss=87.3365,或者其他奇怪的数值。

2、在使用caffe调用自己训练好的模型时,一定要将test.prototxt文件中的权重偏置等参数初始化设置全部删除,要不然会在创建层时卡住退出,这里要删除的内容都是需要反向传播的参数,如卷积和全连接层中的权重和参数初始化以及学习率。

3、在使用test.prototxt时,要注意是否需要预处理,如减去均值,设置像素值范围等,否则可能会出现无论输入任何图片,得到的特征值都是一模一样的情况。

4、在将图片数据转成lmdb或leveldb时,将图像和label成对打乱(shuffle)会更好,要不然一批中都是同一类型的图片,网络无法学习。

5、测试模型时,deploy文件的数据层如果为Input层,则只有一个参数,也就是指定网络输入的大小和维度,没有其他参数可以设置(参考博客https://blog.csdn.net/xiaoxu2050/article/details/81875971),因此无法通过设置参数的形式来进行预处理,如设置像素均值。需要在外面代码中提前做减去均值的操作。

6、在测试时BN层的 use_global_stats 参数要设置为true,但是在训练时必须设置为False,否则loss忽大忽小,网络不会收敛。

7、caffe中常用层的排列顺序:conv-> BN ->scale ->Relu(或者其他激活函数)  ->dropout

8、finetune时,将不需要复制权重的层,也就是需要重新学习的层,重命名,然后修改类别数为自己数据集的类别数。

如果需要冻结参数,需要在layer里面加上param { lr_mult: 0}

9、caffe中的softmaxwithloss层 有个参数:loss_weight,通常默认情况下不写,但是如果有其他的损失需要与softmax加权求和的话,就得在新的loss层中使用loss_weight这个参数,参考centerloss层:L=softmaxloss+λ*centerlosss最后输出会显示三个loss:softmaxloss,centerloss,加权求和的总loss。

10、caffe中编译了python或者matlab接口,一定要复制caffe生成的“caffe”文件夹到python的sitepakages文件夹下,否则不会生效。matlab同理。

11、caffe中的dropout层,在测试时不起作用,所以可以不写,默认输出所有单元。在训练时需要设置dropratio参数,这个参数表示以概率p使输出节点置0,也就是不工作,不更新,也就是保留1-p比例的输出,相当于每次训练一个子网络。

12、caffe中计算卷积的输出特征图尺寸时,如果步长为2,不能整除,则向下取整,池化则是向上取整。

13、caffe中添加DepthwiseConvolution层,不用在caffe.proto中声明。

14、scale层,若要完成两层相乘的功能,必须注意两个bottom的输入次序,如第一个是 4维:[16,32,112,112],第二个是[16,32],不能调换次序,否则会报维度相关的错误。代码中计算是广播第二个输入来匹配第一个输入,所以第一个输入的bottom的维度要>=第二个输入的bottom。                   

15、当需要调用预训练模型finetune时,训练参数为:  

caffe train --solver=mobilenet_solver.prototxt --weights=mobilenet.caffemodel ,

这样训练是从第0次迭代开始的; 但是如果想在之前断点处继续训练,则训练参数需要改为:

caffe train --solver=mobilenet_solver.prototxt --snapshot=mobilenet_iter_2000.solverstate,

这样训练就是从2000次迭代开始。

训练时出现的错误:

(1)check failed: status==CUDNN_STATUS_SUCCESS(4 vs 0)

   解决办法:将deploy.prototxt中的 #engin :caffe 改为 engin :caffe (也就是去掉前面的注释符号#)

  (2) 无法解析prototxt文件

  解决办法:检查prototxt中的关键字有没有写错或丢失,以及各种括号是否匹配完整。

  (3) 某层的blobs数目错误,或者某层有多个数据来源

  解决办法:检查是否两个层使用了相同的名字

  (4) caffe训练一次迭代就停止,也就是iterarion=0 这一次,后面不会训练

  解决办法:检查solver文件是否漏写了stepsize

  (5) 训练一开始就报Input层未定义,那就说明,没有将层的定义包含进来,这时候要嘛手动添加相关的包含目录,要嘛重新新建工程,建议直接复制caffe自带的classification工程,可以不用自己再去包含各种目录。

(6)finetune训练时报错:state.history_size() == history_.size() (360 vs. 180) Incorrect length of history blobs

说明finetune训练时命令写错了 ,比如--weights写成--weight或--snapshot

 

#-------------------------------------------------------------------------------------------------------------------------------------------------------------

记录下训练mobileNetv3的采坑过程。

1、数据:

总共20类,随机取了70%做训练集,剩下的做验证集,利用convert_imageset.exe将图片格式转为lmdb格式,这里生成了训练集和验证集:train_lmdb,test_lmdb,然后利用compute_image_mean.exe计算训练集和验证集的均值文件,得到两个二进制文件:

2、训练

solver:

net: "mobilenetv3_trainval.prototxt"
test_iter: 500
test_interval: 500
base_lr: 0.001
weight_decay: 0.0005
#type: "Adam"
lr_policy: "step"
gamma: 0.1
momentum: 0.9
stepsize: 5000
display: 10
max_iter: 10000
snapshot: 1000
snapshot_prefix: "../model/20classes/with_mean2/"
# solver mode: CPU or GPU
solver_mode: GPU

 train.prototxt

#--------------------------方法1--------------------------
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
# mean pixel / channel-wise mean instead of mean image
 transform_param { 
   mean_file: "E:/dataset/RoadCar/all/mean/trainmean.binaryproto"
   crop_size: 224
   mirror: true
 }
  data_param {
    source: "E:/dataset/RoadCar/all/train_lmdb"
    batch_size: 32
    backend: LMDB
  }
}
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
# mean pixel / channel-wise mean instead of mean image
 transform_param {
   mean_file: "E:/dataset/RoadCar/all/mean/testmean.binaryproto"
   crop_size: 224
   mirror: false
 }
  data_param {
    source: "E:/dataset/RoadCar/all/test_lmdb"
    batch_size: 32
    backend: LMDB
  }
}

这里只列出了数据层,因为这个数据层的预处理,导致后面有些差异,下面是方法二:

#----------------------------方法二--------------------------
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
# mean pixel / channel-wise mean instead of mean image
 transform_param { 
   mean_value: 104
   mean_value: 117
   mean_value: 123
   crop_size: 224
   mirror: true
 }
  data_param {
    source: "E:/dataset/RoadCar/all/train_lmdb"
    batch_size: 32
    backend: LMDB
  }
}
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
# mean pixel / channel-wise mean instead of mean image
 transform_param {
   mean_file: "E:/dataset/RoadCar/all/mean/testmean.binaryproto"
   mean_value: 104
   mean_value: 117
   mean_value: 123
   crop_size: 224
   mirror: false
 }
  data_param {
    source: "E:/dataset/RoadCar/all/test_lmdb"
    batch_size: 32
    backend: LMDB
  }
}

可以看到方法一和方法二的减去均值操作不一样,方法一用的是均值文件,方法二用的是直接指定像素均值。

关于均值的作用,可以参考博客:

https://blog.csdn.net/yangdashi888/article/details/79340195

https://blog.csdn.net/qq_19329785/article/details/84569604

3、测试

方法一:训练时用mean_value方式,测试用memory_data_layer层,可以设置mean_value来减去均值

测试准确率:0.9677-0.97

方法二:训练时用mean_value方式,测试用Input层

测试准确率:(测试不加mean文件)0.6209

                  (测试时加上mean文件)0.8951

                (测试时在代码中指定mean_value)0.9670 (见caffe工程中新建的extractfeature项目,里面修改了代码,可以指定mean_value,如下图)

方法三:训练时用mean文件,测试用mean文件

测试准确率:0.9384

 

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值