一、简介
运行caffe,需要先创建一个模型(model),如比较常用的Lenet等, 而一个模型由多个屋(layer)构成,每一屋又由许多参数组成。所有的参数都定义在caffe.prototxt这个文件中。要熟练使用caffe,最重要的就是学会配置文件(prototxt)的编写。
层有很多种类型,比如Data,Convolution,Pooling等,层之间的数据流动是以Blobs的方式进行。数据层是每个模型的最底层,是模型的入口,不仅提供数据的输入,也提供数据从Blobs转换成别的格式进行保存输出。通常数据的预处理(如减去均值, 放大缩小, 裁剪和镜像等),也在这一层设置参数实现。
数据来源可以来自高效的数据库(如LevelDB和LMDB),也可以直接来自于内存。如果不是很注重效率的话,数据也可来自磁盘的hdf5文件和图片格式文件。
二、数据层的公用参数:示例
layer {
name: "cifar" # 表示该层的名字,争取见名知意
type: "Data" # 层类型。如果是Data,表明数据来源LevelDB或LMDB。 数据的来源不同,数据层类型也不同
top: "data" # top或bottom:每一层用bottom输入数据,top输出数据。top和bottom可以有多个或零个。
top: "label"
include {
phase: TRAIN
} # 用include来指定该层属于训练层或测试层。
# 如果没有include参数,则表示该层既在训练模型也在测试模型中
transform_param {
scale: 0.00390625 # 实际上是1/255,即将输入数据由0-255归一化为0-1之间
mean_file: "examples/cifar10/mean.binaryproto" # 用配置文件进行均值操作
mirror:1 # 1/0表示开启和关闭镜像,也可以用 true 和 false 表示
crop_size: 227 # 裁剪一个227*227的图块。训练时随机剪裁,测试时从中间剪裁
}
# 数据的预处理,可以将数据变换到定义的范围内
data_param {
source: "examples/cifar10/cifar10_train_lmdb"
batch_size: 100
backend: LMDB
}
# data_param部分,根据数据的来源不同,进行不同的设置。 下文详解
}
三、数据层 data_param 参数解析
data_param参数表明数据的来源,不同的数据来源具有不同的设置方法。数据可以来自数据库(LevelDB和LMDB),内存,HDF5,图片,windows。
1.来源于数据库(LevelDB和LMDB)
layer {
name: "mnist"
type: "Data" # 来源于数据库,设置为Data
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
scale: 0.00390625
}
data_param {
source: "examples/mnist/mnist_train_lmdb" # 包含数据库的目录名称 必选参数
batch_size: 64 # 每次处理数据的个数 必选参数
# rand_skip: # 在开始的时候跳过某个数据的输入,通常对异步的SGD很有用。非必选参数
backend: LMDB # 选择是采用LevelDB还是LMDB, 默认是LevelDB。 非必选参数
}
}
2.来源于内存
layer {
top: "data"
top: "label"
name: "memory_data"
type: "MemoryData" # 层类型:MemoryData
memory_data_param{
batch_size: 2 # 每一次处理的数据个数
height: 100 # 宽度
width: 100 # 高度
channels: 1 # 通道数
}
transform_param {
scale: 0.0078125
mean_file: "mean.proto"
mirror: false
}
}
3.来源于HDF5
layer {
name: "data"
type: "HDF5Data" # 层类型:HDF5Data
top: "data"
top: "label"
hdf5_data_param {
source: "examples/hdf5_classification/data/train.txt" # 读取的文件名称
batch_size: 10 # 每一次处理的数据个数
}
}
4. 来源于图片
layer {
name: "data"
type: "ImageData" # 层类型:ImageData
top: "data"
top: "label"
transform_param {
mirror: false
crop_size: 227
mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"
}
image_data_param {
source: "examples/_temp/file_list.txt"
#一个文本文件的名字,每一行给定一个图片文件的名字和标签
batch_size: 50 # 每次处理的数据个数,即图片数
new_height: 256 # 如果设置,将图片进行 resize 操作
new_width: 256
}
}
5. 来源于 windows
layer {
name: "data"
type: "WindowData" # 层类型:WindowData
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 227
mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"
}
window_data_param {
source: "examples/finetune_pascal_detection/window_file_2007_trainval.txt"
# 一个文本文件的名字
batch_size: 128 # 每次处理的数据个数,即图片数
fg_threshold: 0.5
bg_threshold: 0.5
fg_fraction: 0.25
context_pad: 16
crop_mode: "warp"
}
}