caffe的各种数据层在caffe.proto文件中有定义。通过对定义的caffe.proto文件进行编译,产生支持各种层操作的c++代码。后面将会详细解读caffe.proto文件(在caffe里就是当做一个自动代码生成工具来用)。
本文主要介绍caffe可以读入数据的各种格式,方便后面采用caffe训练自己的数据
数据的来源主要有以下几种:
(1)高效的数据库(LevelDB或者LMDB)
(2)内存
(3)硬盘文件,HDF5格式或者图片格式的文件。此种方式效率较差,目前一般是先将原生数据转换为(1)中的数据库格式,然后再来处理
绝大部分数据层在设置时,都可以先对数据进行一定的预处理,包括归一化scale,去中心化(减去平均值),水平镜像flip,随机裁剪crop等四种预处理方式。
该四种预处理方式可以靠该Layer的transform_params属性(HDF5 Layer没有该属性。。。)来指定。指定方式如下:
transform_param {
# randomly horizontally mirror the image
mirror: 1
# crop a `crop_size` x `crop_size` patch:
# - at random during training
# - from the center during testing
crop_size: 227
# substract mean value(RGB three channel): these mean_values can equivalently be replaced with a mean.binaryproto file as
# mean_file: name_of_mean_file.binaryproto
mean_value: 104
mean_value: 117
mean_value: 123
}
数据预处理只是数据层transfor_params属性的一部分,其余transform_params属性可以在caffe.proto文件里的Message类型:TransformationParameter下查找。
二.数据来源于数据库(LevelDB或者LMDB)
LMDB:Lightning MemoryMapped Databases,由于Caffe的文件读取方式使得该格式的数据输入最适用于1-K分类问题
层参数设置实例:
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: 1
crop_size: 227
mean_value: 104
mean_value: 117
mean_value: 123