caffe HDF5Data 层使用及数据生成

参考文章:http://blog.csdn.net/shuzfan/article/details/52503683

http://www.cnblogs.com/yinheyi/p/6083855.html

有些时候,我们的输入不是标准的图像,而是其它一些格式,比如:频谱图、特征向量等等,这种情况下LMDB、Leveldb以及ImageData layer等就不好使了,这时候我们就需要一个新的输入接口——HDF5Data.

(1) 在Matlab中生成HDF5文件

这里直接以例子的形式说明如何生成:

1、手写体的数据集

%读完后,labels为一个50000*1的数组;
labels = loadMNISTLabels('trainlabelsidx1ubyte');
% reshape images to 4D:
[rows,col,channel,numbers]
trainData=reshape(images,[28 28 1 size(images,2)]);
% permute to [cols,rows,channel,numbers]
trainData=permute(trainData,[2 1 3 4]);
% permute lables to [labels, number of labels ]
trainLabels=permute(labels,[2,1]);
% create database
%注意,这是的/data与/label表示文件里的dataset.当我们定义.proto文件的网络时,一定要注意:top:分别也要为data和label.
h5create('train.hdf5','/data',size(trainData),'Datatype','double');
h5create('train.hdf5','/label',size(trainLabels),'Datatype','double');
h5write('train.hdf5','/data',trainData);
h5write('train.hdf5','/label',trainLabels);
% same for test data
生成文件以后,可以通过h5disp(’文件名‘)看看里面的东西。下面是我自己生成的文件里的内容,不是上面生成的
哦;
>> h5disp('train.hdf5')
HDF5 train.hdf5
Group '/'
Dataset 'data'
Size: 256x1x1x200
MaxSize: 256x1x1x200
Datatype: H5T_IEEE_F64LE (double)
ChunkSize: []
Filters: none
FillValue: 0.000000
Dataset 'label'
Size: 1x200
MaxSize: 1x200
Datatype: H5T_IEEE_F64LE (double)
ChunkSize: []
Filters: none
FillValue: 0.000000


查看proto文件中的内容

layer {
   name: "mnist"
   type: "HDF5Data"
   top: "data" 
   top: "label"
   include {
   phase: TRAIN
 }
   hdf5_data_param {
     source: "mydata/train_list.txt" 
   batch_size: 200
 }

注意:
第一,再生成HDF5文件时,一定要注意数组的维度关系,很敏感的,如,把1*50000写为了50000*1肯定会出错
的。在caffe中,数据都是以4维出现的。(我记得python与matlab里的维度是正反的,python与C语言中都是
rowmajor, matlab中是 columnmajor,
相应的就是, matlab是一组维度中,左边的数字变化最快,,而
python中为右边。好像是这样的)
第二,生成的HDF5的dataset的名称一定要与你后面定义的.proto文件里的data层的top:后面的名称(即输出的
名称)一样啊,要不出错,找不到数据的)。
第三,在定义.proto文件里的data层时注意,hdf5_data_param的source不要直接写我们生成的HDF5文件的路
径,而是写一个.txt文件的,并在.txt文件里写入你生成的HDF5文件的路经,一个HDF5文件路径占一行,一定要
这样哦。原因是因为,我们可以要读入多个HDF5文件,所以要这样写哦。
第四,生成的HDF5文件一般都很大,如果是图片的话,可以很多的,HDF5Data layer不能按照batch来从磁盘上
读取数据,只能一次性把所有数据从h5文件中读到内存中,如果出错了,很可以你的内存不够了哦;
第五,HDF5Data layer不支持预处理功能。



2 问题:输入data是512*1的矢量,共1000个样本,label是标量。

代码如下:

% 创建HDF5文件,包含data和label两个变量,数据类型是caffe支持的float型数据

h5create('train.h5','/data',[1 1 512 1000],'Datatype','single');
h5create('train.h5','/label',[1 1 1 1000],'Datatype','single');

%reshape: width x height x channels x num,注意MATLAB读数据是列优先,是和C++里面相反的。所以写数据的时候也要倒着写。

train_data  = reshape(train_data,[1 1 512 1000]);
train_label = reshape(train_label,[1 1 1 1000]);

h5write('train.h5' ,'/data' , single(train_data));
h5write('train.h5' ,'/label', single(train_label));
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

关于HDF5在MATLAB里面的的其它用法,比如从指定位置开始写等等,请参照MATLAB文档。

(2) caffe中HDF5层的用法

注意:由于单个HDF5文件大小有限制,MATLAB下好像最大只能生成5G大小的文件,因此当我们的训练数据较多的时候,往往需要将数据分别写入多个H5文件中。

下面直接给出caffe中HDF5Data-layer的使用示例:

layer {
  name: "data"
  type: "HDF5Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  hdf5_data_param {
  source: "train.txt"
  batch_size: 128
  shuffle: true
  }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

由于可能存在多个H5文件,所以HDF5Data的输入是从一个TXT文件读取的列表,train.txt内容示例如下:

train1.h5
train2.h5
...
 
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

还需要注意,shuffle是对H5文件进行乱序,而每个H5文件内部的顺序不动。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uncle_ll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值