matlab neural-network hdf5 deep-learning caffe

matlab - [caffe]: la comprobación falla: La comprobación falló: hdf_blobs_[i]-> shape(0)== num(200 vs. 6000)



neural-network hdf5 (1)

El problema

Parece que efectivamente existe un conflicto con el orden de los elementos en las matrices: matlab organiza los elementos desde la primera dimensión hasta la última (como fortran), mientras que caffe y hdf5 almacenan las matrices desde la última dimensión hasta la primera:
Supongamos que tenemos X de forma n x c x h x w entonces el "segundo elemento de X " es X[2,1,1,1] en matlab pero X[0,0,0,1] en C (1- La indexación basada en vs 0 no hace la vida más fácil).
Por lo tanto, cuando guarda una matriz de size=[200, 6000, 1, 1] en Matlab, lo que hdf5 y caffe realmente están viendo es como una matriz de shape=[6000,200] .

El uso de la herramienta de línea de comandos h5ls puede ayudarlo a detectar el problema.
En matlab has guardado

>> 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'' );

Ahora puede inspeccionar el resultado my_data.h5 usando h5ls (en la terminal de Linux):

user@host:~/$ h5ls ./my_data.h5 label_train Dataset {200} new_train_x Dataset {6000, 200}

Como puede ver, las matrices se escriben "al revés".

Solución

Teniendo en cuenta este conflicto al exportar datos desde Matlab, debe 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'' );

Inspeccione el resultado my_data.h5 usando h5ls ahora resulta con:

user@host:~/$ h5ls ./my_data.h5 label_train Dataset {200, 1, 1, 1} new_train_x Dataset {200, 6000, 1, 1}

Que es lo que esperabas en primer lugar.

Tengo el tren y los datos de la etiqueta como data.mat. (Tengo 200 datos de entrenamiento con 6000 características y las etiquetas son (-1, +1) que se han guardado en data.mat).

Estoy tratando de convertir mis datos en hdf5 y ejecutar Caffe usando:

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'' );

Y mi layer.prototxt (solo capa de datos) es:

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 } }

pero tengo un error: (Error de verificación: 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)

¡¡¡¡Muchas gracias!!!! Cualquier consejo sería apreciado!