Существует ли общий формат для нейронных сетей

Разные команды используют разные библиотеки для обучения и запуска нейронных сетей (caffe, torch, theano...). Это затрудняет совместное использование: каждая библиотека имеет собственный формат для хранения сетей, и вам приходится устанавливать новую библиотеку каждый раз, когда вы хотите протестировать работу других команд.

Я ищу решения, чтобы сделать это менее утомительным: - Существует ли предпочтительный (общий?) формат для хранения нейронных сетей? - Есть ли сервис или библиотека, которые могут помочь обрабатывать разные типы сетей/или преобразовывать один тип в другой?

Благодарю вас!


person David    schedule 20.11.2015    source источник
comment
Краткий ответ: нет и нет. Обычно у каждой библиотеки есть свои плюсы и минусы в зависимости от того, что именно вы планируете делать. Поскольку они работают по-разному, было бы трудно сформулировать рекомендации или спецификации, которые бы соответствовали каждой библиотеке, поэтому не существует предпочтительного общего формата. Если, конечно, кто-то не придумает формат, отвечающий большинству потребностей.   -  person FrancoisBaveye    schedule 20.11.2015


Ответы (2)


Есть ли предпочтительный (общий?) формат для хранения нейронных сетей?

Каждая библиотека/фреймворк имеет свою собственную сериализацию, например. Caffe использует буферы протокола, Torch использует встроенная схема сериализации и объекты Theano могут быть сериализовано с помощью pickle.

В некоторых случаях, например OverFeat или darknet веса и смещения хранятся на диске в двоичном формате через простые fwrite-s соответствующих float(или double) непрерывных массивов (см. этот ответ для более подробной информации). Обратите внимание, что это не распространяется на архитектуру сети/модели, которую необходимо знать или представлять отдельно (например, явно объявляется во время загрузки).

Также: библиотека, такая как libccv, хранит структуру и веса в база данных SQLite.

Есть ли служба или библиотека, которые могут помочь в работе с различными типами сетей или преобразовать один тип в другой?

Я не думаю, что существует хоть одна (мета) библиотека, которая заявляет об этом. Но существуют отдельные проекты, которые предоставляют удобные конвертеры.

Некоторые примеры (не исчерпывающие):

--

ОБНОВЛЕНИЕ (2017-09): две важные инициативы:

(1) формат ONNX (он же Open Neural Network Exchange):

[...] стандарт для представления моделей глубокого обучения, который позволяет передавать модели между платформами

Посмотрите этот блог сообщения.

(2) формат CoreML, представленный Apple:

[...] общедоступный формат файла (.mlmodel) для широкого набора методов машинного обучения [...] Модели в этом формате можно напрямую интегрировать в приложения через Xcode.

person deltheil    schedule 21.11.2015
comment
Другой недавней инициативой является Формат обмена нейронными сетями от Khronos Group. - person Anderson Green; 08.10.2019

ONNX (обмен открытыми нейронными сетями)

ONNX — это экосистема искусственного интеллекта с открытым исходным кодом, предоставляющая общий формат для нейронных сетей.

  • Это помогает конвертировать одну модель глубокого обучения в другую.

    Как правило, преобразование модели занимает недели/месяцы без ONNX:

    ONNX предлагает более простой и быстрый процесс преобразования:

    Обо всех поддерживаемых преобразованиях см. здесь.

  • Это упрощает развертывание, модели хранятся гораздо более удобным способом: введите здесь описание изображения На приведенном выше изображении ONNX действует как уровень приема данных. , преобразует каждую входную модель в один и тот же формат. В противном случае все модели были бы похожи на кучу кусочков головоломки, не подходящих друг к другу.


Как использовать ONNX — пример преобразования Keras

Допустим, у вас есть модель Keras и вы хотите преобразовать ее в ONNX:

model = load_model("keras_model.hdf5")  # h5 is also OK!

onnx_model = keras2onnx.convert_keras(model, model.name)

onnx_model_file = 'output_model.onnx'
onnx.save_model(onnx_model, onnx_model_file)

Затем загрузите и запустите сохраненную модель:

onnx_model = onnx.load_model('output_model.onnx')

content = onnx_model.SerializeToString()
sess = onnxruntime.InferenceSession(content)
x = x if isinstance(x, list) else [x]
feed = dict([(input.name, x[n]) for n, input in enumerate(sess.get_inputs())])

# Do inference
pred_onnx = sess.run(None, feed)

В этом примере используется keras2onnx для преобразования Keras модели и onnxruntime, чтобы сделать вывод.

Примечание. В формате ONNX также существует множество предварительно обученных моделей. Проверьте это!


Ссылки:
1. https://towardsdatascience.com/onnx-made-easy-957e60d16e94
2. https://blog.codecentric.de/en/2019/08/portability-deep-learning-frameworks-onnx/
3. http://on-demand.gputechconf.com/gtc/2018/presentation/s8818-onnx-interoperable-deep-learning-presented-by-facebook.pdf
4. https://devblogs.nvidia.com/tensorrt-3-faster-tensorflow-inference/

person isydmr    schedule 17.01.2020