[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 的形状 nxcxhxw 那么“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)的主要内容,如果未能解决你的问题,请参考以下文章

Caffe:训练后的GPU CUDA错误:检查失败:错误== cudaSuccess(30 vs. 0)未知错误

检查失败:如何在深层使用 hdf5 数据层?

确定哪些检查失败

CentOS6.0启动失败,文件系统检查失败,怎样启动?

12306登录显示操作失败请检查时间设置是啥意思?

STC_ISP检查MCU失败