数据是学习的原料,参考官网和网友的资料,来看一下数据与数据层。
数据:输入与输出
在Caffe中,数据是以Blobs流动的(见caffe学习(1)caffe模型三种结构)。数据层的输入输出便需要由其他格式与Blobs进行相互转换。一些常见的变换如平均减法(mean-subtraction)、特征缩放是通过data layer配置完成。新的输入类型需要开发新的数据层,网络的其余部分遵循Caffe层目录的模块化。下段加载了MNIST数据:
layer {
name: "mnist"
# Data layer loads leveldb or lmdb storage DBs for high-throughput.加载leveldb 或 lmdb类型的数据实现高吞吐量
type: "Data"
# the 1st top is the data itself: the name is only convention
top: "data"
# the 2nd top is the ground truth: the name is only convention
top: "label"
# the Data layer configuration
data_param {
# path to the DB
source: "examples/mnist/mnist_train_lmdb"
# type of DB: LEVELDB or LMDB (LMDB supports concurrent reads)
backend: LMDB
# batch processing improves efficiency.
batch_size: 64
}
# common data transformations
transform_param {
# feature scaling coefficient: this maps the [0, 255] MNIST data to [0, 1]
scale: 0.00390625
}
}
- name: 表示该层的名称,可随意取,本层为”mnist”。
- type: 层类型,如果是Data,表示数据来源于LevelDB或LMDB。根据数据的来源不同,数据层的类型也不同(后面会详细阐述)。一般在练习的时候,我们都是采用的LevelDB或LMDB数据,因此层类型设置为Data。
- top或bottom: 每一层用bottom来输入数据,用top来输出数据。如果只有top没有bottom,则此层只有输出,没有输入。反之亦然。如果有多个 top或多个bottom,表示有多个blobs数据的输入和输出。
- data 与 label: 在数据层中,至少有一个命名为data的top。如果有第二个top,一般命名为label。 这种(data,label)配对是分类模型所必需的。本例中第一个top是数据本身,第二个top是label(ground truth)(这些名字只是约定的)。
- include: 一般训练的时候和测试的时候,模型的层是不一样的。该层(layer)是属于训练阶段的层,还是属于测试阶段的层,需要用include来指定。如果没有include参数,则表示该层既在训练模型中,又在测试模型中。(上例中没有出现)
include {
phase: TRAIN #仅在训练中出现
}
- Transformations: 数据的预处理,可以将数据变换到定义的范围内。如设置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的图块,在训练阶段随机剪裁(random cropping),在测试阶段从中间裁剪
crop_size: 227
}
- prefetching:预取,对于吞吐量数据层获取下一批数据,并在Net计算当前批处理时在后台准备。
具体的还需要分析data_param,data_param部分,就是根据数据的来源不同,来进行不同的设置。
数据来自于数据库(如LevelDB和LMDB)
层类型(layer type):Data- 必须设置的参数:
source: 包含数据库的目录名称
batch_size: 每次处理的数据个数,如64 可选的参数:
rand_skip: 在开始的时候,跳过一定数量的数据输入,通常对异步的SGD很有用(useful for asynchronous sgd)。
backend: 选择是采用LevelDB还是LMDB, 默认是LevelDB.
示例:data_param { source: "examples/mnist/mnist_train_lmdb" batch_size: 64}
- 必须设置的参数:
数据来自于内存
层类型:MemoryData- 必须设置的参数:
batch_size:每一次处理的数据个数,比如2
channels:通道数
height:高度
width: 宽度
即指定要从内存中读取的输入块的大小。存储器数据层直接从存储器读取数据,而不复制它。为了使用它,必须调用MemoryDataLayer :: Reset
(C ++)或Net.set_input_arrays
(Python),以便指定一个连续数据源(作为4D行主数组),一次读取一个批处理大小的块。示例:
layer { top: "data" top: "label" name: "memory_data" type: "MemoryData" memory_data_param{ batch_size: 2 height: 100 width: 100 channels: 1 } transform_param { scale: 0.0078125 mean_file: "mean.proto" mirror: false } }
- 必须设置的参数:
数据来自于HDF5(Input)
层类型:HDF5Data- 必须设置的参数:
source: 读取的文件名称
batch_size: 每一次处理的数据个数
示例:
layer { name: "data" type: "HDF5Data" top: "data" top: "label" hdf5_data_param { source: "examples/hdf5_classification/data/train.txt" batch_size: 10 } }
- 必须设置的参数:
数据输出到HDF5(Output)
层类型:HDF5Data- 必须设置的参数:
file_name: 输出到的文件名称
HDF5输出层执行与本节中其他层相反的功能:它将其输出blob写入磁盘。
- 必须设置的参数:
数据来自于图片
层类型:ImageData- 必须设置的参数:
source: 一个文本文件的名字,每一行给定一个图片文件的名称和标签(label)
batch_size: 每一次处理的数据个数,即图片数 - 可选参数:
rand_skip: 在开始的时候,跳过一定的数据输入。通常对异步的SGD很有用。
shuffle: 随机打乱顺序,默认值为false
new_height,new_width: 如果设置,则将图片进行resize
示例:
layer { name: "data" type: "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 new_width: 256 } }
- 必须设置的参数:
数据来源于Windows
层类型:WindowData- 必须设置的参数:
source: 一个文本文件的名字
batch_size: 每一次处理的数据个数,即图片数
示例:
layer { name: "data" type: "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" } }
- 必须设置的参数:
Dummy
DummyData用于调试,详见DummyDataParameter。