Caffe 不读取所有 h5 文件
Caffe not reading all h5 files
我在 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 个数据集 - X
、Meta
和 Labels
。最初,我将所有这些都保存在 1 个 h5 文件中,但由于 caffe 无法处理大于 2 GB 的 h5 文件,我不得不将 X(假设 X 包含 5000 个样本)分成 5 个部分。在第一个 h5 中,我将 Meta 和 Labels 与第一部分一起存储,即; X 的 1000 个样本,在剩余的 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)
我认为最主要的是 'Check failed: hdf_blobs_[i]->num() == num (5000 vs. 1000)'
我假设 caffe 只读取第一个 h5 文件,我怎样才能让它读取所有 5 个 h5 文件?请帮忙!
您希望如何 caffe
同步所有文件中的所有输入数据?您希望它从第二个文件读取 X
并从第一个文件读取 Meta
吗?
如果您要实现 "HDF5Data"
层,您 期望数据如何为您布局?
目前在 caffe 中实现的方式,所有变量都应该以相同的方式在 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
.
的整数倍,这可能会有所帮助
我在 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 个数据集 - X
、Meta
和 Labels
。最初,我将所有这些都保存在 1 个 h5 文件中,但由于 caffe 无法处理大于 2 GB 的 h5 文件,我不得不将 X(假设 X 包含 5000 个样本)分成 5 个部分。在第一个 h5 中,我将 Meta 和 Labels 与第一部分一起存储,即; X 的 1000 个样本,在剩余的 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)
我认为最主要的是 'Check failed: hdf_blobs_[i]->num() == num (5000 vs. 1000)'
我假设 caffe 只读取第一个 h5 文件,我怎样才能让它读取所有 5 个 h5 文件?请帮忙!
您希望如何 caffe
同步所有文件中的所有输入数据?您希望它从第二个文件读取 X
并从第一个文件读取 Meta
吗?
如果您要实现 "HDF5Data"
层,您 期望数据如何为您布局?
目前在 caffe 中实现的方式,所有变量都应该以相同的方式在 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
.