caffe将用训练好的caffemodel和train_val.prototxt文件分类新的一张图片-上篇--caffe学习(6)

来源:互联网 发布:历史发展的必然性 知乎 编辑:程序博客网 时间:2024/05/16 06:48

经过前文介绍之后可以训练得到caffemodel文件,同时得到train_val.prototxt文件,但是我们分类时需要的是deploy.prototxt文件。
因此需要手动将train_val.prototxt文件转换成deploy.prototxt文件
首先将train_val.prototxt文件复制一份保存为deploy.prototxt文件

cp train_val.prototxt deploy.prototxt

首先解释一下两个文件的本质差异:

train_val.prototxt文件:    提供训练网络的输入,输出,网络结构具体参数    训练结束后得到一个caffemodel,model内的参数是各个层之间的权重W和偏置b,    model详解可参考我的上一篇文章deploy.prototxt文件:    在已经得到caffemodel的前提下让输入的参数在训练好的网络里面forward一次,并不更新model中的任何参数,只是使用model中的参数

有了以上基础知识,我们就知道在deploy文件中不需要包含权重W和偏置b的设置
然后编辑deploy.prototxt文件
1:删除其中的原来的weight_filler、bias_filler参数部分

layer {                              # weight_filler、bias_filler删除  name: "ip2"  type: "InnerProduct"  bottom: "ip1"  top: "ip2"  param {    lr_mult: 1   #权重w的学习率倍数  }  param {    lr_mult: 2    #偏置b的学习率倍数  }  inner_product_param {    num_output: 10    weight_filler {      type: "gaussian"      std: 0.1    }    bias_filler {      type: "constant"    }  }}

删除后变为

layer {                               name: "ip2"  type: "InnerProduct"  bottom: "ip1"  top: "ip2"  param {    lr_mult: 1  }  param {    lr_mult: 2  }  inner_product_param {    num_output: 10  }}

2:不需要原来的accuracy层

layer {                                  #删除该层  name: "accuracy"  type: "Accuracy"  bottom: "ip2"  bottom: "label"  top: "accuracy"  include {    phase: TEST  }}

3:最后的loss层也要做调整
将原来的:

layer{  name: "loss"   #注意此处层名称与下面的不同  type: "SoftmaxWithLoss"  #注意此处与下面的不同  bottom: "ip2"  bottom: "label"    #注意标签项在下面没有了,因为下面的预测属于哪个标签,因此不能提供标签  top: "loss"}

修改为

layer {  name: "prob"  type: "Softmax"  bottom: "ip2"  top: "prob"}

4:deploy.prototxt文件只需要对应的输入参数,不需要包含第一层data层
删除像这样的包含 phase: TEST或者 phase: TRAIN的两层,一般在文件的开头,

name: "BN-Inception"layer {  name: "data"  type: "VideoData"  top: "data"  top: "label"  video_data_param {    source: "data/ucf101_flow_train_split_1.txt"    batch_size: 32    new_length: 5    num_segments: 3    modality: FLOW    shuffle: true    name_pattern: "flow_%c_%05d.jpg"  }  transform_param{    crop_size: 224    mirror: true    fix_crop: true    more_fix_crop: true    multi_scale: true    max_distort: 1    scale_ratios: [1,.875,.75]    mean_value: 128    is_flow: true  }  include: { phase: TRAIN }}layer {  name: "data"  type: "VideoData"  top: "data"  top: "label"  video_data_param {    source: "data/ucf101_flow_val_split_1.txt"    batch_size: 1    new_length: 5    num_segments: 3    modality: FLOW    name_pattern: "flow_%c_%05d.jpg"  }  transform_param{    crop_size: 224    mirror: false    mean_value: 128    is_flow: true  }  include: { phase: TEST }

取而代之输入:

layer {  name: "data"  type: "Input"  top: "data"  input_param { shape: { dim: 1 dim: 3 dim: 32 dim: 32 } }}

参数shape: { dim: 1 dim: 3 dim: 32 dim: 32 }代表的含义如下:

shape {  dim: 1  #num,对待识别样本进行数据增广的数量,可自行定义。一般会进行5次crop,之后分别flip。如果该值为10则表示一个样本会变成10个,之后输入到网络进行识别。如果不进行数据增广,可以设置成1  dim: 3  #通道数,表示RGB三个通道  dim: 32   #图像的长和宽,通过 *_train_test.prototxt文件中数据输入层的crop_size获取  dim: 32

本文参考:
1
2

0 0
原创粉丝点击