Caffe学习笔记(三):Caffe数据是如何输入和输出的?
Caffe中的数据流以Blobs进行传输,在《Caffe学习笔记(一):Caffe架构及其模型解析》中已经对Blobs进行了简单的介绍。下面对caffe数据是如何输入和输出做更加详细的分析。
1、输入/输出之Blobs
caffe使用blobs结构来存储、交换并处理网络中正向和反向迭代时的数据和导数信息,blob是caffe的标准数组结构,是caffe中处理和传递实际数据的数据封装包,它提供了一个统一的内存接口,从数学意义上说,blob是按C风格连续存储的N维数组。
数据层包括输入层和输出层,数据输入层将输入转换为blob加载数据,数据输出层将blob转换为其他格式输出。
均值消去、特征缩放等基本数据处理都是在数据输入层进行配置的。新的数据格式输入需要定义新的数据层,网络的其余部分遵循caffe中层目录的模块结构设定。
2、caffe数据输入层
数据输入层一般定义在*.prototxt中,以cifar为例,就是包含在cifar10_quick_train_test.prototxt中,数据输入层可以包括带训练的数据输入和待预测数据输入。下面随机给出一个例子:
layer { name: "mnist" type: "Data" # 数据层加载leveldb或lmdb的数据库存储格式保证快速传输 top: "data" # 第一个顶部(top)是数据本身:“data”的命名只是方便使用 top: "label" # 第二个顶部(top)是数据标签:“label”的命名只是方便使用 # 数据层具体配置 data_param { source: "examples/mnist/mnist_train_lmdb" # 数据库路径 backend: LMDB # 数据库类型:LEVELDB或LMDB(LMDB支持并行读取) batch_size: 64 # 批量处理,提高效率 } # 常用数据转换 transform_param { scale: 0.00390625 # 特征归一化系数,将范围为[0, 255]的MNIST数据归一化为[0, 1] } }
需要注意的是:
(1)、对于数据输入层,数据层从top的blobs向模型输出数据,但是没有bottom的blobs,因为数据层没有输入,而是采用数据层加载的方式;
(2)、数据层至少要有一个top输出,规范化的命名为data,对于ground truth,规范化的命名为label,这两个top只是简单生成blobs,它们的命名没有任何特殊含义,只是( data,label)映射关系对于分类模型更方便而已;
(3)、在数据层的定义中,数据预处理通过转换参数来定义;
(4)、数据层通过下面语法定义该层的数据是用来训练的还是用来预测的:
include { phase:TRAIN }
或
include { phase:TEST }
(5)、为了提高网络吞吐量,数据层在网络计算当前数据块的同时在后台获取并准备下一个数据块;
(6)、网络可以有任意数量和类型的输入,可根据需要定义任意数量的数据层,但是必须保证它们有唯一的name和top。
3、caffe数据输出层
数据输出层是用训练出来的模型进行预测得出的结果输出层,下面给出一个实例:
layer { name:"accuracy" type:"Accuracy" bottom:"ip2" bottom:"label" top:"accuracy" #训练出来的模型预测出来的准确度 include { phase:TEST #说明该输出是预测得出的输出结果 } }
关于caffe数据层的知识后续可结合代码做进一步的分析。