Python深度学习之Keras模型转换成ONNX模型流程详解
作者:FeathersMouch 发布时间:2023-01-02 00:32:44
从Keras转换成PB模型
请注意,如果直接使用Keras2ONNX
进行模型转换大概率会出现报错,这里笔者曾经进行过不同的尝试,最后都失败了。
所以笔者的推荐的情况是:首先将Keras模型转换为TensorFlow PB模型。
那么通过tf.keras.models.load_model()
这个函数将模型进行加载,前提是你有一个基于h5
格式或者hdf5
格式的模型文件,最后再通过改变模型的保存格式save_format
参数改为tf
。即可实现从Keras转换为TensorFow的格式文件了。
import tensorflow as tf
model_path = './models/model.h5' # 模型文件
model = tf.keras.models.load_model(model_path)
model.save('tfmodel', save_format='tf')
转换后的模型文件结构是这样的:
.
├── assets
├── keras_metadata.pb
├── saved_model.pb
└── variables
├── variables.data-00000-of-00001
└── variables.index2 directories, 4 files
从PB模型转换成ONNX模型
从PB模型转换为ONNX模型是很简单的,通过调用tf2onnx
这个模块下的convert
来进行处理。
你需要做的,只需要将--save-model
来指定你已经转换好的TensorFlow
模型,使用--output
来指定你的ONNX模型输出的路径(需要指定一个独立的文件,如./xx/xx.onnx)
python -m tf2onnx.convert --saved-model ./tfmodel/ --output ./models/model.onnx --opset 11 --verbose
这样我们就得到一个ONNX模型:
.
├── model.h5
├── model.onnx
└── model_fp16.onnx
改变现有的ONNX模型精度
考虑到在不同的计算设备上,半精度和双精度锁带来的性能提升是显而易见的。
这里我使用了一个VGG16的模型来测试了fp16和fp32的性能。
----------------------
VGG Full Precision:
Data Size: 124
VGGFullPrecision Timing: 7.462206602096558 Seconds
Connections: 1824812148
----------------------
VGG Half Precision:
Data Size: 124
VGGHalfPrecision Timing(In TensorRT): 2.563319444656372 Seconds
Connections: 1824812148
----------------------
可以看到,在我这张RTX2060上,启用fp16相较于fp32的性能提升接近3倍。
那么我们该如何将现有的ONNX模型从fp32模型转换成fp16模型呢?
首先我们需要准备一个叫onnxmltools
的库。可以通过pip来进行安装。
pip install onnxmltools
确认安装好onnxmltools后,我们通过如下的一段脚本进行精度的转换:
import onnxmltools
# 加载float16_converter转换器
from onnxmltools.utils.float16_converter import convert_float_to_float16
# 使用onnxmltools.load_model()函数来加载现有的onnx模型
# 但是请确保这个模型是一个fp32的原始模型
onnx_model = onnxmltools.load_model('../module/models/model.onnx')
# 使用convert_float_to_float16()函数将fp32模型转换成半精度fp16
onnx_model_fp16 = convert_float_to_float16(onnx_model)
# 使用onnx.utils.save_model()函数来保存,
onnxmltools.utils.save_model(onnx_model_fp16, '../module/models/model_fp16.onnx')
部署ONNX 模型
在部署ONNX模型阶段,我们将使用onnxruntime
这个模块。
针对你所将使用的计算设备,如果你是CPU用户,那么你需要使用如下的指令来安装onnxruntime
pip install onnxruntime
反之,如果你的计算设备是是GPU,那么你需要使用如下的指令来安装onnxruntime
pip install onnxruntime-gpu
确认好onnxruntime安装完成后,你只需要使用如下的指令来加载你的ONNX模型即可
import onnxruntime as ort
# 指定onnx模型所在的位置
model_path = './module/models/model.onnx'
# 创建providers参数列表
providers = [
# 指定模型可用的CUDA计算设备参数
('CUDAExecutionProvider', {
# 因为这里笔者只有一张GPU,因此GPU ID序列就为0
'device_id': 0,
# 这里网络额外策略使用官方默认值
'arena_extend_strategy': 'kNextPowerOfTwo',
# 官方这里默认建议的GPU内存迭代上限是2GB,如果你的GPU显存足够大
# 可以将这里的2修改为其它数值
'gpu_mem_limit': 2 * 1024 * 1024 * 1024,
# cudnn转换算法的调用参数设置为完整搜索
'cudnn_conv_algo_search': 'EXHAUSTIVE',
# 确认从默认流进行CUDA流赋值
'do_copy_in_default_stream': True,
}),
'CPUExecutionProvider',
]
# 使用onnxruntime.InferenceSession()函数创建Session
# 第一参数为模型所在的路径,第二参数为模型的providers参数列表
session = ort.InferenceSession(model_path, providers=providers)
# 通过get_input()函数和get_output()函数获取网络的输入和输出名称
input_name = session.get_inputs()[0].name
output_name = session.get_outputs()[0].name
# 使用session.run()函数执行ONNX任务
# 值得注意的是,这里演示使用的ONNX模型是FP32精度的模型
# 如果你使用的fp16模型但传入的数据是fp32类型的会抛出数据异常的错误
# 另外ONNX的异常抛出是十分人性化的,它会指明你在推理是发生异常的具体位置以及应对策略
result = session.run(
[output_name], {input_name: image.astype(np.float32)})[0]
result = result.argmax()
来源:https://blog.csdn.net/Deaohst/article/details/126864267
猜你喜欢
- 源码:#路飞骷髅import turtle as t#黄底帽子t.pu()t.goto(0,200)t.circle(-130,-80)t.
- GraphSAGE是一种用于图神经网络中的节点嵌入学习方法。它通过聚合节点邻居的信息来生成节点的低维表示,使节点表示能够更好地应用于各种下游
- 本文实例讲述了Python实现返回数组中第i小元素的方法。分享给大家供大家参考,具体如下:#! /usr/bin/env python#co
- 一、备份数据库1、打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server2、SQL Server组-->
- 中文分词(Chinese Word Segmentation),将中文语句切割成单独的词组。英文使用空格来分开每个单词的,而中文单独一个汉字
- 别人复制你网站的文章时自动加上注释,这个功能你在很多网站应该都有体会过,当我们复制一段内容时,就自动在文章后面加上了网站的一些
- 我就废话不多说了,大家还是直接看代码吧!stdi, stdo, stde = sys.stdin, sys.stdout, sys.stde
- <?php // fix 404 pages: header('HTTP/1.1 200 OK'); // set 4
- 刚才运行了一段代码,来查看Request.ServerVariables里面有多少值,看了一下,共50个!代码<%=Request.S
- 目前可实现:MD5算法、SHA256算法、先MD5后SHA256、先SHA256后MD5、两次MD5、两次SHA256、前8位MD5算法后8
- 本文实例讲述了JS实现简易图片轮播效果的方法。分享给大家供大家参考。具体如下:这里使用JS制作简易图片轮播效果:制作比较粗糙,使用的图片是w
- 人生苦短,菜鸟学Python!今天,我们会一次性分享6个堪称神仙的内置函数。在很多计算机书籍中,它们也通常作为高阶函数来介绍。而我自己在日常
- 现在我们用python代码实现感知器算法。# -*- coding: utf-8 -*-import numpy as npclass Pe
- 最近看到市场上各种的文档格式转换软件,要么是收费、要么是有大量的广告。于是学习了一下 PyQt5 的页面操作,再加上了解 pandas 的使
- 痛点在传统的工作中,发送会议纪要是一个比较繁琐的任务,需要手动输入邮件内容、收件人、抄送人等信息,每次发送都需要重复操作,不仅费时费力,而且
- set oSQLServer =server.createobject("SQLDMO.SQLServer"
- parse_dates : boolean or list of ints or names or list of lists or dic
- 本文实例讲述了php下pdo的mysql事务处理用法。分享给大家供大家参考。具体分析如下:php+mysql事务处理的几个步骤:1.关闭自动
- HMAC 算法可用于验证在应用程序之间传递或存储在潜在易受攻击位置的信息的完整性。基本思想是生成与共享密钥组合的实际数据的加密散列。然后,可
- django ajax发送post请求的两种方法,具体内容如下所述:第一种:将csrf_token放在from表单里 <script&