不久前,我面临着使用本机C++
代码启动经过训练的Kesas
神经网络Kesas
的生产任务。 奇怪的是,解决方案一点也不微不足道。 结果,有一个私人图书馆,提供了这样的机会。 关于它的样子-干净的十字架上的神经网络,将是今天的短文。
对于那些迫不及待的人-这是github存储库,其中包含用法的详细说明。 好吧,我问猫下的其他人...
问题陈述。
在此过程中,我需要在C++
应用程序(虚幻引擎4)中运行经过训练的模型。 但是,这是不幸的事情:今天,几乎没有办法在C ++中运行Keras模型。
C++
的Python
调用选项对我来说似乎并不好。 另一个选择是将Keras模型转换为TensorFlow模型,然后构建用于十字架的TensoFflow,并从C ++代码调用TF API。
本文对变形的过程进行了很好的描述。 但是与此同时也出现了困难。 首先 ,TensorFlow将通过Bzzel
。 边框本身是一个异想天开的东西,并且拒绝在UE4下组装。 其次 , TF
本身是一个相当大而笨重的东西,但是我想要更轻巧和高效的东西。 我只能说在github的开放空间上找到了一个半工作的项目 ,具有我需要的功能。 但是,他不支持Python
和Keras
的当前版本。 并尝试重新制作它失败: C ++应用程序因Core Dump
error崩溃 。 习惯上写自己的实现...
我们正在写我们的图书馆!
更加艰难地晃动石头,扔瓶子 皮瓦萨 精力充沛,我坐在代码旁。 TensorFlow代码,尝试修复
代码上的代码,一些有关算法和数据结构的知识(这要归功于ITMO的课程)以及我耳中的好音乐对我实现该库有很多帮助。 不知何故,图书馆在一晚上就写好了。
等见:Keras2cpp!
该库的第一部分是Python模块,用于将训练后的模型保存为自己的二进制格式。
此操作没有什么复杂的。 我们只是读取Keras
模型,然后一点一点地写入文件:首先
,然后是
,然后
float
格式
。
现在,让我们继续学习最美味的-C ++实现。
用户具有2个实体tensor
和model
。
张量 - 重新分配神经网络所使用的数据,并且是张量的计算机实现。 当前支持的最大尺寸为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
cpp_mpdel.cc:
#include "keras_model.h" int main() {
我就是这么想的。 乐于使用它,我将使用我心爱的C#和Python进一步编写神经网络。
聚苯乙烯
我喜欢写这个库。 当您从头开始编写所有内容时,您将了解更多,但了解它是如何工作的……我们计划增加对其他架构和GPU的支持……
github仓库
来源