Как загрузить обученную модель кафе в формате h5 в c++ caffe net?

Обычно обученные модели кафе имеют расширение .caffemodel, а на самом деле они имеют формат binary protobuf.

Есть идеи, как загрузить модель кафе в формате hdf5 в сеть кафе на С++?

У меня есть модель, обученная с помощью python caffe в формате hdf5.

Мое приложение находится на С++ с использованием версии caffe С++, и я предпочитаю использовать С++, чем python.

Как прочитать модель в обученной модели caffe в формате hdf5 в c++ caffe net?

Я знаю, что внутри caffe есть слой hdf5data. Есть ли пример программы для этого?

ИЗМЕНИТЬ:

Я использовал API CopyTrainedLayersFromHDF5() и получил следующие ошибки времени выполнения.

HDF5-DIAG: Error detected in HDF5 (1.8.11) thread 140737353775552:
  #000: ../../../src/H5G.c line 463 in H5Gopen2(): unable to open group
    major: Symbol table
    minor: Can't open object
  #001: ../../../src/H5Gint.c line 320 in H5G__open_name(): group not found
    major: Symbol table
    minor: Object not found
  #002: ../../../src/H5Gloc.c line 430 in H5G_loc_find(): can't find object
    major: Symbol table
    minor: Object not found
  #003: ../../../src/H5Gtraverse.c line 861 in H5G_traverse(): internal path traversal failed
    major: Symbol table
    minor: Object not found
  #004: ../../../src/H5Gtraverse.c line 641 in H5G_traverse_real(): traversal operator failed
    major: Symbol table
    minor: Callback failed
  #005: ../../../src/H5Gloc.c line 385 in H5G_loc_find_cb(): object 'data' doesn't exist
    major: Symbol table
    minor: Object not found
F0220 15:32:14.272573 24576 net.cpp:811] Check failed: data_hid >= 0 (-1 vs. 0) Error reading weights from model_800000.h5
*** Check failure stack trace: ***
    @     0x7ffff64afdcd  google::LogMessage::Fail()
    @     0x7ffff64b1d08  google::LogMessage::SendToLog()
    @     0x7ffff64af963  google::LogMessage::Flush()
    @     0x7ffff64b263e  google::LogMessageFatal::~LogMessageFatal()
    @     0x7ffff691c3a3  caffe::Net<>::CopyTrainedLayersFromHDF5()
    @           0x40828d  ExtractFeature::ExtractFeature()
    @           0x40ce78  main
    @     0x7ffff5bf8f45  __libc_start_main
    @           0x4080c9  (unknown)

Program received signal SIGABRT, Aborted.
0x00007ffff5c0dc37 in __GI_raise (sig=sig@entry=6)
    at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56  ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) cd 
[17]+  Stopped                 gdb ./endtoendlib

ИЗМЕНИТЬ 1:

>>h5ls model_800000.h5 command gave me

conv1                    Group
conv2                    Group
forget_gate              Dataset {1, 250, 1, 1274}
inception_3a             Group
inception_3b             Group
inception_4a             Group
inception_4b             Group
inception_4c             Group
inception_4d             Group
inception_4e             Group
inception_5a             Group
inception_5b             Group
input_gate               Dataset {1, 250, 1, 1274}
input_value              Dataset {1, 250, 1, 1274}
ip_bbox_unscaled0.p0     Dataset {4, 250}
ip_bbox_unscaled0.p1     Dataset {4}
ip_bbox_unscaled1.p0     Dataset {4, 250}
ip_bbox_unscaled1.p1     Dataset {4}
ip_bbox_unscaled2.p0     Dataset {4, 250}
ip_bbox_unscaled2.p1     Dataset {4}
ip_bbox_unscaled3.p0     Dataset {4, 250}
ip_bbox_unscaled3.p1     Dataset {4}
ip_bbox_unscaled4.p0     Dataset {4, 250}
ip_bbox_unscaled4.p1     Dataset {4}
ip_conf0.p0              Dataset {2, 250}
ip_conf0.p1              Dataset {2}
ip_conf1.p0              Dataset {2, 250}
ip_conf1.p1              Dataset {2}
ip_conf2.p0              Dataset {2, 250}
ip_conf2.p1              Dataset {2}
ip_conf3.p0              Dataset {2, 250}
ip_conf3.p1              Dataset {2}
ip_conf4.p0              Dataset {2, 250}
ip_conf4.p1              Dataset {2}
output_gate              Dataset {1, 250, 1, 1274}
post_fc7_conv.p0         Dataset {1024, 1024, 1, 1}
post_fc7_conv.p1         Dataset {1024}

person batuman    schedule 20.02.2017    source источник
comment
Да, я проверил файл .h5, и он в двоичном формате.   -  person batuman    schedule 20.02.2017
comment
но правильный ли двоичный формат? если вы h5ls model_80000.h5 что вы получите? похоже, что caffe ожидает, что файл будет иметь набор данных 'data', которого там нет...   -  person Shai    schedule 20.02.2017
comment
Команда h5ls дала мне как в EDIT1. Я вижу набор данных.   -  person batuman    schedule 20.02.2017
comment
как вы сохранили этот model_80000.h5 файл? это спасло кофе? Метод caffe net.ToHDF5(...), который сохраняет веса в файле hdf5, сохраняет параметры в data (и, возможно, diff) наборах данных. В вашем файле нет этого набора данных. вы можете попробовать вручную настроить файл и добавить data/ ко всем наборам данных в файле...   -  person Shai    schedule 20.02.2017


Ответы (1)


Рассматривали ли вы метод объекта net void CopyTrainedLayersFromHDF5(const string trained_filename); ? Кажется, он делает то, что вы ищете.

Что касается слоя "HDF5Data": здесь вы путаете две вещи. В вашем файле hdf5 хранятся обученные параметры сети. Напротив, слой "HDF5Data" хранит обучающие примеры, используемые для обучения сети.

person Shai    schedule 20.02.2017
comment
да, ваше решение верное. Мне нужно поработать над моим файлом h5, чтобы его можно было загрузить в c++ caffe. - person batuman; 21.02.2017