2016-01-10 55 views
1

我在hdf5數據層給出了train.txt中列出的以下h5文件。Caffe不能讀取所有h5文件

/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個數據集 - X,這些文件MetaLabels。最初,我將所有這些保存在1個h5文件中,但由於caffe無法處理大於2 GB的h5文件,因此我必須將X分爲5部分(假設X包含5000個樣本),共5部分。在第一個h5中,我將Meta和Labels與第一部分一起存儲, 1000個X的樣本,在其餘的4個H5文件中,每個樣本都有1000個樣本。 當我開始微調,朱古力崩潰,並顯示以下錯誤消息

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) 

主要的事情,根據我是「檢查失敗:hdf_blobs_ [I] - > NUM()== NUM​​(5000與1000) '
從中我認爲caffe只讀取第一個h5文件,我怎樣才能讀取所有5個h5文件?請幫忙!

回答

3

您如何期望caffe可以跨所有文件同步所有輸入數據?你期望它從第二個文件中讀取X,從第一個文件中讀取Meta
如果您要實施"HDF5Data"圖層,您希望爲您制定數據?

現在在caffe中實現的方式是,所有變量都應該以相同的方式在HDF5文件之間進行劃分。也就是說,如果您決定將X分成5個文件,例如第一個文件中包含1000個樣本,第二個文件中包含1234個樣本等。那麼您必須使用除以MetaLabelstrain_data1.h5將包含1000個樣本X,MetaLabel; train_data2.h5將具有1234個樣本X,MetaLabel等等。

Caffe不會將所有數據加載到內存中,它只會提取SGD迭代所需的批處理。因此,在不同文件中分割變量是沒有意義的。此外,如果您將每個文件中存儲的樣本數設爲batch_size的整數倍,則可能會有所幫助。