[caffe]:检查失败:检查失败:hdf_blobs_ [i] - > shape(0)== num(200 vs. 6000)

时间:2015-12-22 14:24:19

标签: matlab neural-network hdf5 deep-learning caffe

我有火车和标签数据作为data.mat。 (我有200个训练数据,6000个特征和标签是(-1,+ 1)已保存在data.mat中。

我正在尝试在hdf5中转换数据并使用以下命令运行Caffe:

load data.mat
hdf5write('my_data.h5', '/new_train_x', single( reshape(new_train_x,[200, 6000, 1, 1]) ) );
hdf5write('my_data.h5', '/label_train', single( reshape(label_train,[200, 1, 1, 1]) ), 'WriteMode', 'append' );

我的layer.prototxt(只是数据层)是:

layer {
  type: "HDF5Data"
  name: "data"
  top: "new_train_x"     # note: same name as in HDF5
  top: "label_train"     # 
  hdf5_data_param {
    source: "/path/to/list/file.txt"
    batch_size: 20
  }
  include { phase: TRAIN }
}

但是,我有一个错误: (检查失败:hdf_blobs_ [i] - > shape(0)== num(200 vs. 6000))

I1222 17:02:48.915861  3941 layer_factory.hpp:76] Creating layer data
I1222 17:02:48.915871  3941 net.cpp:110] Creating Layer data
I1222 17:02:48.915877  3941 net.cpp:433] data -> new_train_x
I1222 17:02:48.915890  3941 net.cpp:433] data -> label_train
I1222 17:02:48.915900  3941 hdf5_data_layer.cpp:81] Loading list of HDF5 filenames from: file.txt
I1222 17:02:48.915923  3941 hdf5_data_layer.cpp:95] Number of HDF5 files: 1
F1222 17:02:48.993865  3941 hdf5_data_layer.cpp:55] Check failed: hdf_blobs_[i]->shape(0) == num (200 vs. 6000) 
*** Check failure stack trace: ***
    @     0x7fd2e6608ddd  google::LogMessage::Fail()
    @     0x7fd2e660ac90  google::LogMessage::SendToLog()
    @     0x7fd2e66089a2  google::LogMessage::Flush()
    @     0x7fd2e660b6ae  google::LogMessageFatal::~LogMessageFatal()
    @     0x7fd2e69f9eda  caffe::HDF5DataLayer<>::LoadHDF5FileData()
    @     0x7fd2e69f901f  caffe::HDF5DataLayer<>::LayerSetUp()
    @     0x7fd2e6a48030  caffe::Net<>::Init()
    @     0x7fd2e6a49278  caffe::Net<>::Net()
    @     0x7fd2e6a9157a  caffe::Solver<>::InitTrainNet()
    @     0x7fd2e6a928b1  caffe::Solver<>::Init()
    @     0x7fd2e6a92c19  caffe::Solver<>::Solver()
    @           0x41222d  caffe::GetSolver<>()
    @           0x408ed9  train()
    @           0x406741  main
    @     0x7fd2e533ca40  (unknown)
    @           0x406f69  _start
Aborted (core dumped)

非常感谢!!!!任何建议将不胜感激!

1 个答案:

答案 0 :(得分:3)

问题

似乎确实存在与数组中元素顺序的冲突:matlab将元素从第一维排列到最后一维(如fortran),而caffe和hdf5将数组从最后一维存储到第一维:
假设我们document形状为X x n x c x h,那么w&#34;&#34;第二元素;在matlab中是X但在C中是X[2,1,1,1](从1开始对基于0的索引并不能让生活变得更轻松。)
因此,当您在Matlab中保存X[0,0,0,1]数组时,hdf5和caffe实际看到的是size=[200, 6000, 1, 1]的数组。

使用h5ls命令行工具可以帮助您发现问题 在matlab中你保存了

shape=[6000,200]

现在,您可以使用>> hdf5write('my_data.h5', '/new_train_x', single( reshape(new_train_x,[200, 6000, 1, 1]) ); >> hdf5write('my_data.h5', '/label_train', single( reshape(label_train,[200, 1, 1, 1]) ), 'WriteMode', 'append' ); (在Linux终端中)检查生成的my_data.h5

h5ls

正如您所看到的,数组被编写为&#34;向后&#34;。

解决方案

从Matlab导出数据时考虑到这种冲突,你应该permute

user@host:~/$ h5ls ./my_data.h5
  label_train              Dataset {200}
  new_train_x              Dataset {6000, 200}

使用load data.mat hdf5write('my_data.h5', '/new_train_x', single( permute(reshape(new_train_x,[200, 6000, 1, 1]),[4:-1:1] ) ); hdf5write('my_data.h5', '/label_train', single( permute(reshape(label_train,[200, 1, 1, 1]), [4:-1:1] ) ), 'WriteMode', 'append' ); 现在结果检查生成的my_data.h5

h5ls

首先是您的预期。