[caffe]:检查失败:检查失败:hdf_blobs_[i]->shape(0) == num (200 vs. 6000)
Posted
技术标签:
【中文标题】[caffe]:检查失败:检查失败:hdf_blobs_[i]->shape(0) == num (200 vs. 6000)【英文标题】:[caffe]: check fails: Check failed: hdf_blobs_[i]->shape(0) == num (200 vs. 6000) 【发布时间】:2016-03-28 20:19:06 【问题描述】:我将火车和标签数据作为 data.mat。 (我有 200 个训练数据,其中包含 6000 个特征,标签是 (-1, +1) 已保存在 data.mat 中)。
我正在尝试将我的数据转换为 hdf5 并使用以下方法运行 Caffe:
load data.mat
hdf5write('my_data.h5', '/new_train_x', single( reshape(new_train_x,[200, 6000, 1, 1]) ) );
hdf5write('my_data.h5', '/label_train', single( reshape(label_train,[200, 1, 1, 1]) ), 'WriteMode', 'append' );
而我的 layer.prototxt(只是数据层)是:
layer
type: "HDF5Data"
name: "data"
top: "new_train_x" # note: same name as in HDF5
top: "label_train" #
hdf5_data_param
source: "/path/to/list/file.txt"
batch_size: 20
include phase: TRAIN
但是,我有一个错误: (检查失败:hdf_blobs_[i]->shape(0) == num (200 vs. 6000))
I1222 17:02:48.915861 3941 layer_factory.hpp:76] Creating layer data I1222 17:02:48.915871 3941 net.cpp:110] Creating Layer data I1222 17:02:48.915877 3941 net.cpp:433] data -> new_train_x I1222 17:02:48.915890 3941 net.cpp:433] data -> label_train I1222 17:02:48.915900 3941 hdf5_data_layer.cpp:81] Loading list of HDF5 filenames from: file.txt I1222 17:02:48.915923 3941 hdf5_data_layer.cpp:95] Number of HDF5 files: 1 F1222 17:02:48.993865 3941 hdf5_data_layer.cpp:55] Check failed: hdf_blobs_[i]->shape(0) == num (200 vs. 6000) *** Check failure stack trace: *** @ 0x7fd2e6608ddd google::LogMessage::Fail() @ 0x7fd2e660ac90 google::LogMessage::SendToLog() @ 0x7fd2e66089a2 google::LogMessage::Flush() @ 0x7fd2e660b6ae google::LogMessageFatal::~LogMessageFatal() @ 0x7fd2e69f9eda caffe::HDF5DataLayer<>::LoadHDF5FileData() @ 0x7fd2e69f901f caffe::HDF5DataLayer<>::LayerSetUp() @ 0x7fd2e6a48030 caffe::Net<>::Init() @ 0x7fd2e6a49278 caffe::Net<>::Net() @ 0x7fd2e6a9157a caffe::Solver<>::InitTrainNet() @ 0x7fd2e6a928b1 caffe::Solver<>::Init() @ 0x7fd2e6a92c19 caffe::Solver<>::Solver() @ 0x41222d caffe::GetSolver<>() @ 0x408ed9 train() @ 0x406741 main @ 0x7fd2e533ca40 (unknown) @ 0x406f69 _start Aborted (core dumped)
非常感谢!!!!任何建议将不胜感激!
【问题讨论】:
你能h5ls
文件my_data.h5
吗?
我怀疑类似于this: "注意:HDF5 库对多维数组使用 C 样式排序,而 MATLAB 使用 FORTRAN 样式排序。请参阅“使用MATLAB 低级 HDF5 函数”在 MATLAB 文档中了解更多信息。”
@Shai ,我想是的,我检查它并注意你。非常感谢。
【参考方案1】:
问题
貌似数组中元素的顺序确实有冲突:matlab是从第一个维度到最后一个维度排列的(如fortran),而caffe和hdf5是从最后一个维度到第一个维度存储数组:
假设我们有 X
的形状 n
xc
xh
xw
那么“X
的第二个元素”在 matlab 中是 X[2,1,1,1]
但在 C 中是 X[0,0,0,1]
基于 0 的索引根本不会让生活更轻松)。
因此,当您在 Matlab 中保存 size=[200, 6000, 1, 1]
的数组时,hdf5 和 caffe 实际看到的是 shape=[6000,200]
的数组。
使用h5ls
命令行工具可以帮助您发现问题。
在matlab中你保存了
>> hdf5write('my_data.h5', '/new_train_x',
single( reshape(new_train_x,[200, 6000, 1, 1]) );
>> hdf5write('my_data.h5', '/label_train',
single( reshape(label_train,[200, 1, 1, 1]) ),
'WriteMode', 'append' );
现在您可以使用 h5ls
(在 Linux 终端中)检查生成的 my_data.h5
:
user@host:~/$ h5ls ./my_data.h5
label_train Dataset 200
new_train_x Dataset 6000, 200
如您所见,数组是“向后”写的。
解决方案
从Matlab导出数据时考虑到这个冲突,你应该permute
:
load data.mat
hdf5write('my_data.h5', '/new_train_x',
single( permute(reshape(new_train_x,[200, 6000, 1, 1]),[4:-1:1] ) );
hdf5write('my_data.h5', '/label_train',
single( permute(reshape(label_train,[200, 1, 1, 1]), [4:-1:1] ) ),
'WriteMode', 'append' );
使用h5ls
检查生成的my_data.h5
现在结果如下:
user@host:~/$ h5ls ./my_data.h5
label_train Dataset 200, 1, 1, 1
new_train_x Dataset 200, 6000, 1, 1
这正是您最初所期望的。
【讨论】:
,我做到了:)。但我还有另一个问题。在内部产品层,在底部blob中,我输入''new_train_x'',但它给出了一个错误。 F1224 20:30:43.874462 22511 insert_splits.cpp:35] 未知底部 blob 'new_train_x'(层 'ip1',底部索引 0)*** 检查失败堆栈跟踪:***。我该怎么办?!非常感谢。 layer name: "ip1" type: "InnerProduct" bottom: "new_train_x" top: "ip1" param lr_mult: 1 param lr_mult: 2 inner_product_param num_output: 30 weight_filler type : "gaussian" # 从高斯标准初始化过滤器 std: 0.01 bias_filler type: "constant" @ahmadnavidghanizadeh 听起来您有一个新 问题。请照此发布。在 cmets 中无法读取代码。 好的。我发布它this。非常感谢。 @Shai 我这里有一点不明白,我们想让caffe读取数据为n * c * h * w,首先这里我明白c(通道数)是1和w是 6000(特征的数量),但从你的回答我知道 c 是 6000 而 w 是 1。我在这里遗漏了什么吗?以上是关于[caffe]:检查失败:检查失败:hdf_blobs_[i]->shape(0) == num (200 vs. 6000)的主要内容,如果未能解决你的问题,请参考以下文章