我如何在C ++中启动Keras

不久前,我面临着使用本机C++代码启动经过训练的Kesas神经网络Kesas的生产任务。 奇怪的是,解决方案一点也不微不足道。 结果,有一个私人图书馆,提供了这样的机会。 关于它的样子-干净的十字架上的神经网络,将是今天的短文。


对于那些迫不及待的人-这是github存储库,其中包含用法的详细说明。 好吧,我问猫下的其他人...


问题陈述。


在此过程中,我需要在C++应用程序(虚幻引擎4)中运行经过训练的模型。 但是,这是不幸的事情:今天,几乎没有办法在C ++中运行Keras模型。


C++Python调用选项对我来说似乎并不好。 另一个选择是将Keras模型转换为TensorFlow模型,然后构建用于十字架的TensoFflow,并从C ++代码调用TF API。


本文对变形的过程进行了很好的描述。 但是与此同时也出现了困难。 首先 ,TensorFlow将通过Bzzel 。 边框本身是一个异想天开的东西,并且拒绝在UE4下组装。 其次TF本身是一个相当大而笨重的东西,但是我想要更轻巧和高效的东西。 我只能说在github的开放空间上找到了一个半工作的项目 ,具有我需要的功能。 但是,他不支持PythonKeras的当前版本。 并尝试重新制作它失败: C ++应用程序因Core Dump error崩溃 。 习惯上写自己的实现...


我们正在写我们的图书馆!


更加艰难地晃动石头,扔瓶子 皮瓦萨 精力充沛,我坐在代码旁。 TensorFlow代码,尝试修复代码上的代码,一些有关算法和数据结构的知识(这要归功于ITMO的课程)以及我耳中的好音乐对我实现该库有很多帮助。 不知何故,图书馆在一晚上就写好了。


等见:Keras2cpp!


该库的第一部分是Python模块,用于将训练后的模型保存为自己的二进制格式。


此操作没有什么复杂的。 我们只是读取Keras模型,然后一点一点地写入文件:首先 ,然后是 ,然后 float格式


现在,让我们继续学习最美味的-C ++实现。


用户具有2个实体tensormodel


张量 - 重新分配神经网络所使用的数据,并且是张量的计算机实现。 当前支持的最大尺寸为4个尺寸。 每个维度的维度都存储在std::vector<int> dims_; 每个张量元素的权重在 std::vector<int> data_; 。 在可用的方法中,可以区分void Print()Tensor Select(int row) 。 您可以在源代码中看到其余的操作。 编写张量数学之后,我开始实现模型。


模型 - 是一组层,其中规定了对张量和权重矩阵的操作。 用户virtual bool LoadModel(const std::string& filename);可以使用2个函数virtual bool LoadModel(const std::string& filename);virtual bool Apply(Tensor* in, Tensor* out);


这是完整的代码示例。


python_model.py:


 import numpy as np from keras import Sequential from keras.layers import Dense #create random data test_x = np.random.rand(10, 10).astype('f') test_y = np.random.rand(10).astype('f') model = Sequential([ Dense(1, input_dim=10) ]) model.compile(loss='mse', optimizer='adam') #train model by 1 iteration model.fit(test_x, test_y, epochs=1, verbose=False) #predict data = np.array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]) prediction = model.predict(data) print(prediction) #save model from keras2cpp import export_model export_model(model, 'example.model') 

cpp_mpdel.cc:


 #include "keras_model.h" int main() { // Initialize model. KerasModel model; model.LoadModel("example.model"); // Create a 1D Tensor on length 10 for input data. Tensor in(10); in.data_ = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}; // Run prediction. Tensor out; model.Apply(&in, &out); out.Print(); return 0; } 

我就是这么想的。 乐于使用它,我将使用我心爱的C#和Python进一步编写神经网络。


聚苯乙烯


我喜欢写这个库。 当您从头开始编写所有内容时,您将了解更多,但了解它是如何工作的……我们计划增加对其他架构和GPU的支持……


github仓库
来源

Source: https://habr.com/ru/post/zh-CN438398/


All Articles