2016-01-10 2 views
1

У меня есть следующие файлы h5, перечисленные в train.txt, которые я передаю слову данных hdf5.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, Meta и Labels в этих файлах. Первоначально я сохранил все эти файлы в 1 h5, но поскольку caffe не может обрабатывать файлы h5 размером более 2 ГБ, мне пришлось разделить X (скажем, X состоит из 5000 образцов), в 5 частях. В первом h5 у меня есть мета и ярлыки, хранящиеся вместе с первой частью, то есть; 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) 

Главное, по моему мнению является «Проверить не удалось: hdf_blobs_ [я] -> Num() == Num (5000 против 1000) '
Из чего я предполагаю, что caffe читает только первый файл h5, как я могу заставить его прочитать все 5 h5 файлов? Пожалуйста помоги!

ответ

3

Как вы ожидаете, caffe синхронизировать все ваши входные данные по всем файлам? Ожидаете ли вы, что он будет читать X со второго файла и Meta с первого?
Если бы вы намеревались реализовать слой "HDF5Data", как бы вы ожидаете, что данные будут выложены для вас?

То, как в настоящее время реализованы в caffe, переменные ALL должны быть разделены между файлами HDF5 таким же образом. То есть, если вы решили, что X будет разделен на 5 файлов, например, 1000 образцов в первом файле, 1234 выборки во втором и т. Д. Затем вы должны делить Meta и Labels таким же образом: train_data1.h5 будет иметь 1000 образцов от X, Meta и Label; train_data2.h5 будет иметь 1234 образца X, Meta и Label и так далее.

Caffe не загружает все данные в память, он извлекает только пакет, необходимый для итерации SGD. Поэтому нет смысла разделить переменные на разные файлы. Более того, это может помочь, если вы сделаете количество выборок, хранящихся в каждом файле, целым числом ваших batch_size.

Смежные вопросы