caffe网络参数文件格式为prototxt,一般有train_val.prototxt,deploy.protxt,solver.protxt。通过这些文件进行训练得到网络模型,比如文件交models中的bvlc_alexnet.caffemodel,bvlc_googlenet.caffemodel;
网络模型是由多个层组成的,一般由data、conv、pooling、full-connection层组成,有些网络虽然比较深,但是基本也是多个卷积、多个全连接。
在caffe源码中,先初始化一个网络net_,参数文件也是包括了prototxt参数文件,然后也可以直接加上已经训练好的网络模型和计算好的mean文件,然后就可以进行测试了(特征提取、分类等)
层与层之间的数据流是以Blobs进行了。
Blob<float>* input_layer = net_->input_blobs()[0];//输入层
Blob<float>* output_layer = net_->output_blobs()[0];//输出层
Blob<float>* feature_blob = net_->blob_by_name(blob_names[i]);//直接根据层名来提取数据
注意数据可以从Blobs与其他数据格式进行转化,比如高效的lmdb、levelDB数据库格式
与数据库的转化:
Datum datum;
datum.set_height(feature_blob->height());
datum.set_width(feature_blob->width());
datum.set_channels(feature_blob->channels());
datum.clear_data();
datum.clear_float_data();
也可以直接与内置数据类型进行转化,比如:
const float*data=feature_blob->cpu_data();
prototxt文件中
include: 一般训练的时候和测试的时候,模型的层是不一样的。该层(layer)是属于训练阶段的层,还是属于测试阶段的层,需要用include来指定。如果没有include参数,则表示该层既在训练模型中,又在测试模型中。
transform_param部分主要是数据的预处理,可以将数据变换到定义的范围内。如设置scale为0.00390625,实际上就是1/255, 即将输入数据由0-255归一化到0-1之间
transform_param {
scale: 0.00390625
mean_file_size: "examples/cifar10/mean.binaryproto"
# 用一个配置文件来进行均值操作
mirror: 1 # 1表示开启镜像,0表示关闭,也可用ture和false来表示
# 剪裁一个 227*227的图块,在训练阶段随机剪裁,在测试阶段从中间裁剪
crop_size: 227
}
data_param部分要根据数据来源的不同进行设置,层类型type:Data,backend默认是levelDB;MemoryData;HDF5Data;ImageData;windowData;要根据不同的类型进行参数设置