经过前文介绍之后可以训练得到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