caffe为什么使用LMDB和levelDB,而不是直接使用原始数据
第一,原始数据的类型,种类很多,如二进制文件,.npy
文件,多种图像可是文件等等,不可能使用统一的代码来读取,所以转换成统一的格式可以简化数据读取层的实现。具体说是将不同类型的数据存储为key-value
的对应关系。便于caffe DataLayer
获取这些数据。
第二,使用LMDB和LEVELDB可以提高磁盘的IO利用率。
较新的caffe,都使用LMDB
,LEVELDB
是caffe早起使用的。
什么是protobuff
ProtoBuff是一种实现内存和其他存储介质数据交换(从磁盘读取数据到内存,从内存保存数据到磁盘)的协议。在caffe中protobuff用于解析.prototxt
文件,包括超参数设置,和模型结构的定义。protobuff将.prototxt
文件中的配置参数按照caffe.proto
的协议解析并加载到内存变量Caffe::SolverParameter
对象中。自己可以尝试对一个solver.prototxt
文件按照caffe.proto
解析出参数.
在caffe中使用一个ProtoBuffer工具完成数据在存储介质间的数据交换。
什么是HDF5
HDF5是一种数据格式,同时还有处理这种数据格式的统一函数库。
HDF5, LMDB, ProtoBuff分别在什么时候使用
caffe 模型结构超参数的定义和训练超参数的定义,使用ProtoBuff(默认),可以看到相应的文件都是以.prototxt
为后缀,也可以使用HDF5。而caffe所处理的数据,要转换成LMDB。
在caffe官方文档中,由关于data layer的描述:数据可以是来自高效的LMDB,levelDB数据库,可以使来自内存,或者来自HDF5或通用的图像格式的数据(当效率不是很重要时)。