Caffe 未读取所有 h5 文件

Posted

技术标签:

【中文标题】Caffe 未读取所有 h5 文件【英文标题】:Caffe not reading all h5 files 【发布时间】:2016-04-15 01:08:46 【问题描述】:

我在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)

据我说,主要的是“检查失败:hdf_blobs_[i]->num() == num (5000 vs. 1000)” 我假设 caffe 只读取第一个 h5 文件,我怎样才能让它读取所有 5 个 h5 文件?请帮忙!

【问题讨论】:

【参考方案1】:

您希望caffe 如何在所有文件中同步您的所有输入数据?您是否希望它从第二个文件中读取 X 并从第一个文件中读取 Meta? 如果您要实现"HDF5Data" 层,希望如何为您布置数据?

目前在 caffe 中实现的方式,所有变量都应该以相同的方式在 HDF5 文件之间进行划分。也就是说,如果您决定将X 分为 5 个文件,例如,第一个文件中有 1000 个样本,第二个文件中有 1234 个样本,等等。那么您必须Meta 和@987654327 分开@ 以同样的方式:train_data1.h5 将有 1000 个 XMetaLabel 的样本; train_data2.h5 将有 1234 个 XMetaLabel 等样本。

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

【讨论】:

以上是关于Caffe 未读取所有 h5 文件的主要内容,如果未能解决你的问题,请参考以下文章

caffe 里面GPU 选择设置, 通过配置文件 读取GPU 的编号。

caffe 里面GPU 选择设置, 通过配置文件 读取GPU 的编号。

caffe代码阅读8: Data_layers的实现细节(各个数据读取层的实现细节) 2016.3.25-28

H5读取本地文件操作

H5文件读取

利用matlab展示并读取.h5文件内容