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

[caffe]: check fails: Check failed: hdf_blobs_[i]->shape(0) == num (200 vs. 6000)

我的火车和标签数据为 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)

非常感谢!!!!如有任何建议,我们将不胜感激!

问题

看来数组中元素的顺序确实存在冲突:matlab将元素从第一维排列到最后一维(如fortran),而caffe和hdf5将数组从最后一维存储到第一维:
假设我们有形状为 nxcxhxwX 那么“X 的第二个元素”是 X[2,1,1,1] 在 matlab 中,但在 C 中 X[0,0,0,1](基于 1 与基于 0 的索引根本不会让生活更轻松)。
因此,当您在 Matlab 中保存 size=[200, 6000, 1, 1] 的数组时,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(在 Linux 终端中)检查生成的 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}

这正是您最初所期望的。