:检查失败:检查失败:hdf_blobs_ – > shape(0)== num(200 vs. 6000)

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

我正在尝试在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) 

非常感谢!!!! 任何意见将不胜感激!

问题

似乎数组中的元素的顺序确实存在冲突:matlab将元素从第一维排列到最后(如fortran),而caffe和hdf5将数组从上一维存储到第一维:
假设我们有X的形状n x c x h x w则在matlab中“ X[2,1,1,1]第二个元素”是X[2,1,1,1] ,但是C(1 X[0,0,0,1]中的X[0,0,0,1]基于0的索引与基于0的索引并没有让生活变得简单)。
因此,在Matlab中保存size=[200, 6000, 1, 1] shape=[6000,200]数组时,hdf5和caffe实际上看到的是shape=[6000,200]数组。

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

 >> 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' ); 

现在,您可以使用h5ls (在Linuxterminal中)检查生成的my_data.h5

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

正如你所看到的,数组是“向后”写的。

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

 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' ); 

使用h5ls现在的结果检查产生的my_data.h5

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

这是你期望的第一个地方。