Caffe没有阅读所有h5文件

时间:2016-01-10 18:50:02

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

我在train.txt中列出了以下h5文件,我将其提供给hdf5数据层。

/home/foo/data/h5_files/train_data1.h5
/home/foo/data/h5_files/train_data2.h5
/home/foo/data/h5_files/train_data3.h5
/home/foo/data/h5_files/train_data4.h5
/home/foo/data/h5_files/train_data5.h5

我在这些文件中有3个数据集 - XMetaLabels。最初,我将所有这些保存在1 h5文件中,但由于caffe无法处理大于2 GB的h5文件,因此我必须将X(X表示包含5000个样本)分为5个部分。在第一个h5中,我将Meta和Labels与第一部分一起存储,即; 1000个X样本,在剩余的4个h5文件中,我每个都有1000个样本。    当我开始微调时,caffe崩溃并出现以下错误消息

0111 07:46:54.094041 23981 layer_factory.hpp:74] Creating layer data
 net.cpp:76] Creating Layer data
 net.cpp:334] data -> X
 net.cpp:334] data -> Labels
 net.cpp:334] data -> Meta
 net.cpp:105] Setting up data
 hdf5_data_layer.cpp:66] Loading list of HDF5  filenames from: /home/foo/hdf5_train.txt
 hdf5_data_layer.cpp:80] Number of HDF5 files: 5
 hdf5_data_layer.cpp:53] Check failed: hdf_blobs_[i]->num() == num (5000 vs. 1000) 

*** Check failure stack trace: ***
    @     0x7f1eebcab0d0  google::LogMessage::Fail()
    @     0x7f1eebcab029  google::LogMessage::SendToLog()
    @     0x7f1eebcaaa07  google::LogMessage::Flush()
    @     0x7f1eebcad98f  google::LogMessageFatal::~LogMessageFatal()
    @     0x7f1ef18ff045  caffe::HDF5DataLayer<>::LoadHDF5FileData()
    @     0x7f1ef18fdca4  caffe::HDF5DataLayer<>::LayerSetUp()
    @     0x7f1ef196bffc  caffe::Net<>::Init()
    @     0x7f1ef196e0b2  caffe::Net<>::Net()
    @     0x7f1ef18cf3cd  caffe::Solver<>::InitTrainNet()
    @     0x7f1ef18cfa3f  caffe::Solver<>::Init()
    @     0x7f1ef18cfe75  caffe::Solver<>::Solver()
    @           0x40a3c8  caffe::GetSolver<>()
    @           0x404fb1  train()
    @           0x405936  main
    @       0x3a8141ed1d  (unknown)
    @           0x4048a9  (unknown)

根据我的说法,主要的是&#39;检查失败:hdf_blobs_ [i] - &gt; num()== num(5000 vs. 1000)&#39;
从中我假设caffe只读取第一个h5文件,如何让它读取所有5个h5文件?请帮忙!

1 个答案:

答案 0 :(得分:3)

您希望caffe如何在所有文件中同步所有输入数据?您是否希望它从第二个文件中读取X并从第一个文件中读取Meta? 如果您要实施"HDF5Data"图层,那么将如何为您安排数据?

目前在caffe中实现的方式,所有变量应以相同的方式在HDF5文件之间分配。也就是说,如果你决定将X分成5个文件,例如第一个文件中有1000个样本,第二个文件中有1234个样本等等。那么你必须除以{{1}和Meta以同样的方式:Labels将有1000个train_data1.h5XMeta的样本; Label将包含1234个train_data2.h5XMeta的样本,依此类推。

Caffe不会将所有数据加载到内存中,它只会获取SGD迭代所需的批处理。因此,将变量拆分为不同的文件是没有意义的。此外,如果您将每个文件中存储的样本数量设置为Label的整数倍,则可能会有所帮助。