C++中用frugally-deep调用keras的模型并进行预测

1、背景

Python语言中的Keras库搭建深度学习模型非常便捷,但有时需要在 C++ 中调用训练好的模型,得到测试集的结果。比如将模型部署于FPGA,中间的一个步骤则需要用C++构建模型。但 Keras库没有提供 C++ API,其中一种解决方法是使用 TensorFlow 的 C++ API,但编译过程非常繁琐,难以成功,而另一种方法,如果不是必须要使用 GPU,frugally-deep是一个不错的选择。

2、介绍

frugally-deep是一个用C++实现的库,只依赖于三个头文件库 FunctionalPlus、Eigen、json,它可以将 Keras 保存的 .h5 文件直接转为 C++ 中可调用的 .json 文件,同时它也是线程安全的,可以很方便的在多 CPU 上进行前向传播。

3、准备工作

(1)支持 C++14 的编译器:Visual Studio 2019

(2)python版本在 3.7 或以上,TensorFlow 2.1.1(可使用pip install TensorFlow下载 )

(3)下载源码:分别前往frugally-deep, FunctionalPlus , Eigen 和 json 点击右侧的 Code,再点击 Download ZIP 下载这些源码,

  1. frugally-deep:https://github.com/Dobiasd/frugally-deep
  2. FunctionalPlus :https://github.com/Dobiasd/FunctionalPlus
  3. Eigen :https://gitlab.com/libeigen/eigen#
  4. Json:https://github.com/nlohmann/json

(4)也可以直接到该网盘连接下载:

链接:https://pan.baidu.com/s/1HX_tPZxmOhr2BHCwu9Mp8A

提取码:1x7e

4、使用过程:以下过程是在以上工作准备就绪后进行

(1)在 Python 中训练好模型后,model.save('....h5', include_optimizer=False) 保存模型,比如frugally-deep 主页上的例子。创建create_model.py,运行 create_model.py 后,当前目录下生成了 keras_model.h5

# create_model.pyimport numpy as npfrom tensorflow.keras.layers import Input, Densefrom tensorflow.keras.models import Modelinputs = Input(shape=(4,))x = Dense(5, activation='relu')(inputs)predictions = Dense(3, activation='softmax')(x)model = Model(inputs=inputs, outputs=predictions)model.compile(loss='categorical_crossentropy', optimizer='nadam')model.fit(np.asarray([[1, 2, 3, 4], [2, 3, 4, 5]]),np.asarray([[1, 0, 0], [0, 0, 1]]), epochs=10)model.save('keras_model.h5', include_optimizer=False)

(2)解压frugally-deep、FunctionalPlus、Eigen、json,将frugally-deep-master文件夹下的keras_export文件复制到create_model.py同一个目录下

(3)打开cmd命令窗口(linux系统打开一个终端),使用命令“python keras_export/convert_model.py keras_model.h5 keras_model.json”将模型的.h文件转为c++可直接调用的.json文件,执行命令后同一个目录下出现keras_model.json文件。

       转换过程中,frugally-deep 会自动对模型进行测试,验证相同的输入下,模型在 Python 和 C++ 中的输出是否相同。若输出不同会直接报错,则不必担心转换出错。

(4)用vs创建一个空共项目,在项目中创建一个main.cpp文件,在main.cpp文件所在的项目文件夹中创建一个include文件夹。

        将 frugally-deep-master文件夹中的include 文件夹中的fdeep文件夹、FunctionalPlus-master文件夹中的include 文件夹中的 fplus 文件夹、将 json-develop 文件夹中的include 文件夹中的nlohmann 文件夹、eigen-master文件夹中的Eigen 文件夹复制到刚创建的include空文件夹内。

// main.cpp#include <fdeep/fdeep.hpp>int main(){const auto model = fdeep::load_model("fdeep_model.json");const auto result = model.predict({fdeep::tensor(fdeep::tensor_shape(static_cast<std::size_t>(4)),{1, 2, 3, 4})});std::cout << fdeep::show_tensors(result) << std::endl;}

(5)在VS创建的项目中,右键点击“解决方案资源管理器”中的项目名称,选择属性 -> 配置属性 -> C/C++ -> 常规,在右侧的附加包含目录中填上 $(ProjectDir)include; 若使用的是 gcc 编译器,要在编译时加上参数 -Iinclude。

(6)运行main.cpp,输出:

5、注意点

如果要预测多个tensor的值,可增加一个循环,如下示例,内部的两层循环是给tensor赋值,最外层循环是控制多个tensor的预测

6、参考网址:该作者已经写的很详细了,学习后,结合自己的项目模型重新理解的写了一下

在 C++ 中调用 keras | iqhy's Blog

C++中用frugally-deep读取keras的模型并进行预测(详细)_1037号森林里一段干木头的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单的线性回归实现模型的存储和读取

和这篇文章对比https://blog.csdn.net/fanzonghao/article/details/81023730 不希望重复定义图上的运算&#xff0c;也就是在模型恢复过程中&#xff0c;不想sess.run(init)首先看路径 lineRegulation_model.py定义线性回归类&#xff1a; import tensorflow as tf "&qu…

MIT重新发明飞机:无需燃料,每秒万米喷射带你上天 | Nature封面

来源&#xff1a;量子位这不是科幻小说&#xff0c;离子引擎飞机真的被造出来了&#xff01;“曲率引擎”、“离子引擎”等等激动人心的科幻名词&#xff0c;正在走进现实。最近MIT又重新发明了飞机&#xff0c;实验成果登上了《自然》杂志封面。这架飞机翼展5米&#xff0c;总…

unet实现区域分割

https://github.com/zonghaofan/pig-seg/tree/master/disk_segmentation 网络架构&#xff1a; # coding:utf-8 import tensorflow as tf import cv2 import numpy as np import matplotlib.pyplot as pltimg cv2.imread(./data/test.png)# cv2.imshow(1.jpg,img) # cv2.wait…

数字图像处理 实验一 图像的基本运算

实验一 图像的基本运算 一、实验目的 &#xff08;1&#xff09;掌握点运算和代数运算的算法实现和概念 &#xff08;2&#xff09;掌握和几何运算的算法实现和概念 &#xff08;2&#xff09;掌握灰度变换和几何变换的基本方法 &#xff08;3&#xff09;理解图像灰度直方图的…

2018世界人工智能蓝皮书:看中国到底有多强!【附下载】| 智东西内参

来源&#xff1a;智东西人工智能是引领未来的战略性高科技&#xff0c;作为新一轮产业变革的核心驱动力&#xff0c;催生新技术、新产品、新产业、新模式&#xff0c;引发经济结构重大变革&#xff0c;深刻改变人类生产生活方式和思维模式&#xff0c;实现社会生产力的整体跃升…

tensorflow(GPU)使用

一&#xff0c;直接指定GPU: tf.ConfigProto一般用在创建session的时候。用来对session进行参数配置 with tf.Session(config tf.ConfigProto(...),...) #tf.ConfigProto()的参数 log_device_placementTrue : 是否打印设备分配日志 allow_soft_placementTrue &#xff1a; 如…

数字图像处理实验二 图像变换

一、实验目的 &#xff08;1&#xff09;了解图像变换的意义和手段。 &#xff08;2&#xff09;熟悉傅立叶变换的基本性质。 &#xff08;3&#xff09;通过实验了解二维频谱的分布特点。 &#xff08;4&#xff09;了解余弦变换或Walsh&#xff0d;Hadamard变换 二、实验内容…

科学家发联合声明:强烈谴责首例免疫艾滋病基因编辑

来源&#xff1a;人民网据人民网报道&#xff0c;来自中国深圳的科学家贺建奎在第二届国际人类基因组编辑峰会召开前一天宣布&#xff0c;一对名为露露和娜娜的基因编辑婴儿于11月在中国健康诞生。这对双胞胎的一个基因经过修改&#xff0c;使她们出生后即能天然抵抗艾滋病。这…

Keras】基于SegNet和U-Net的遥感图像语义分割

from:【Keras】基于SegNet和U-Net的遥感图像语义分割 上两个月参加了个比赛&#xff0c;做的是对遥感高清图像做语义分割&#xff0c;美其名曰“天空之眼”。这两周数据挖掘课期末project我们组选的课题也是遥感图像的语义分割&#xff0c;所以刚好又把前段时间做的成果重新整…

实验四51单片机并口实验

一.实验目的&#xff1a; 1. 了解51单片机I/O口的电气特性和驱动能力。 2. 了解LED电路中加入限流电阻的原因。 3. 掌握定时器原理及编程。 4. 掌握并口程序的编辑、编译、调试和运行。 二.实验设备和器件 1. PC机 2. PROTEUS仿真软件 3. 实验箱 4. ISP下载器 5. 51仿真器…

5G 建设拉动光模块量价齐升

来源&#xff1a;国联证券光模块是光通信的核心部件&#xff0c;它主要完成光电转换和电光转换。行业增长稳定&#xff0c;行业内的头部企业通过不断并购完成上下游的整合&#xff0c;提供一体化的解决方案。国内企业在快速的追赶外资标杆企业&#xff0c;产品逐步往高端方向转…

tensorflow权重初始化

一&#xff0c;用10层神经网络&#xff0c;每一层的参数都是随机正态分布&#xff0c;均值为0&#xff0c;标准差为0.01 #10层神经网络 data tf.constant(np.random.randn(2000, 800).astype(float32)) layer_sizes [800 - 50 * i for i in range(0, 10)] num_layers len(l…

单片机实验报告-片内外RAM的数据转移

一、实验目的&#xff1a; 1.掌握C51编程基础&#xff0c;C51程序结构。 2.掌握C51数据类型、函数设计。 3.掌握C51程序的编辑、编译、调试和运行 二、编程提示 编程将片外8000H单元开始的10字节的内容移至8100H开始的各单元中。8000H单元开始的10字节内容用编程方式赋值。…

单片机实验-定时中断

一.实验目的 1.掌握51单片机定时器工作原理。 2.掌握51单片机中断系统工作原理。 3.掌握定时器初始化编程。 4.掌握中断程序的编写和调试。 二.实验设备和器件 1.KEIL软件 2.PROTEUS仿真软件 3.伟福实验箱 三&#xff0e;实验内容 &#xff08;1&#xff09;编程实…

2018全球最值得关注的60家半导体公司,7家中国公司新上榜 | 年度榜单

编译 | 张玺 四月来源&#xff1a;机器之能由《EE Times》每年评选全球值得关注的 60 家新创半导体公司排行榜——『Silicon 60』&#xff0c;今年已经迈向第 19 届&#xff0c;今年的关键词仍然是「机器学习」(machine learning)&#xff0c;它正以硬件支持的运算形式强势崛起…

单片机实验报告-串口实验

一.实验目的 1. 掌握 51 单片机串口工作原理。 2. 掌握 51 单片机串口初始化编程。 3. 掌握 51 单片机串口的软硬件编程。 二.实验设备和器件 1.KEIL软件 2.PROTEUS仿真软件 3.伟福实验箱 三&#xff0e;实验内容 &#xff08;1&#xff09;编程实现&#xff1a…

学习率周期性变化

学习率周期性变化&#xff0c;能后解决陷入鞍点的问题&#xff0c;更多的方式请参考https://github.com/bckenstler/CLR base_lr:最低的学习率 max_lr:最高的学习率 step_size&#xff1a;&#xff08;2-8&#xff09;倍的每个epoch的训练次数。 scale_fn(x)&#xff1a;自…

清华发布《人工智能AI芯片研究报告》,一文读懂人才技术趋势

来源&#xff1a;Future智能摘要&#xff1a;大数据产业的爆炸性增长下&#xff0c;AI 芯片作为人工智能时代的技术核心之一&#xff0c;决定了平台的基础架构和发展生态。 近日&#xff0c;清华大学推出了《 人工智能芯片研究报告 》&#xff0c;全面讲解人工智能芯片&#xf…

开发者账号申请 真机调试 应用发布

技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong 开发者账号申请 真机调试 应用发布 技术博客http://www.cnblogs.com/ChenYilong/新浪微博http://weibo.com/luohanchenyilong 要解决的问题 • 开发者账号申请 • 真机调试 • 真机调…

单片机实验-DA实验

一、实验目的 1、了解 D/A 转换的基本原理。 2、了解 D/A 转换芯片 0832 的性能及编程方法。 3、了解单片机系统中扩展 D/A 转换的基本方法。 二.实验设备和器件 1.KEIL软件 2.实验箱 三&#xff0e;实验内容 利用 DAC0832&#xff0c;编制程序产生锯齿波、三角波、正弦…