gpt4 book ai didi

matlab - [咖啡] : check fails: Check failed: hdf_blobs_[i]->shape(0) == num (200 vs. 6000)

转载 作者:太空宇宙 更新时间:2023-11-03 20:28:27 25 4
gpt4 key购买 nike

我将火车和标签数据作为 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 对 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)

非常感谢!!!!任何建议将不胜感激!

最佳答案

问题

看来数组中元素的顺序确实存在冲突:matlab将元素从第一维排列到最后一维(如fortran),而caffe和hdf5将数组从最后一维存储到第一维:
假设我们有形状为 nxcxhxwX 那么“X 的第二个元素”在 matlab 中是 X[2,1,1,1]X[0,0,0,1] 在 C 中(基于 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}

这是您一开始所期望的。

关于matlab - [咖啡] : check fails: Check failed: hdf_blobs_[i]->shape(0) == num (200 vs. 6000),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34418027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com