Dav*_*vid 10 neural-network theano deep-learning torch caffe
不同的团队使用不同的库来训练和运行神经网络(caffe,torch,theano ......).这使共享变得困难:每个库都有自己的格式来存储网络,每次要测试其他团队的工作时都必须安装新的库.
我正在寻找解决方案,使这不那么乏味: - 是否有一个首选(共享?)格式来存储神经网络? - 是否有服务或库可以帮助处理不同类型的网络/或将一种类型转换为另一种类型?
谢谢!
del*_*eil 12
是否有一种首选(共享?)格式来存储神经网络?
每个库/框架都有自己的序列化,例如Caffe使用Protocol Buffers,Torch有内置的序列化方案,Theano对象可以用pickle序列化.
在一些情况下,像OverFeat或暗网的重量和偏见经由普通存储在磁盘上的以二进制格式fwrite相应的-s float(或double)相邻的阵列(见此答案为更多的细节).请注意,这不包括必须单独知道或表示的网络/模型的体系结构(如在加载时明确声明).
另外:像libccv这样的库将结构和权重存储在SQLite数据库中.
是否有服务或库可以帮助处理不同类型的网络/或将一种类型转换为另一种类型?
我不认为有一个(meta)图书馆声称这样做.但它存在提供便利转换器的独特项目.
一些例子(非详尽的):
-
更新(2017-09):两个值得注意的举措是:
(1)ONNX格式(又名开放式神经网络交换):
[...]表示深度学习模型的标准,使模型能够在框架之间传递
(2)Apple推出的CoreML格式:
[...]
.mlmodel广泛的ML方法的公共文件格式()[...]这种格式的模型可以通过Xcode直接集成到应用程序中.
ONNX是一个开源 AI 生态系统,为神经网络提供通用格式。
它有助于将深度学习模型转换为另一个模型。
通常,没有ONNX 的模型转换需要数周/数月:

ONNX提供更简单、更快的转换过程:

有关所有支持的转换,请参见此处。
它使部署更容易,模型以更可取的方式存储:
在上图中,ONNX 充当数据摄取层,将每个输入模型转换为相同的格式。否则,所有模型就像一堆相互不匹配的拼图。

假设您有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)
Run Code Online (Sandbox Code Playgroud)
然后加载并运行保存的模型:
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)
Run Code Online (Sandbox Code Playgroud)
这个例子使用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-更快的张量流推理/