当前位置: 首页 > news >正文

keras转onnx,TensorFlow转tf.keras.models.load_model,onnx精度转换

参考:

https://blog.csdn.net/Deaohst/article/details/126864267

转onnx

别直接转onnx。

先转PB:

import tensorflow as tfmodel_path = './models/model.h5'                    # 模型文件
model = tf.keras.models.load_model(model_path)
model.save('tfmodel', save_format='tf')

再转onnx:

 python -m tf2onnx.convert --saved-model ./tfmodel/ --output ./models/model.onnx --opset 12 --verbose

转化成功:
在这里插入图片描述

将原结果和onnx推理结果比对:
原结果:
{‘drawings’: 0.00619311910122633, ‘hentai’: 0.00011550176714081317, ‘neutral’: 0.992009162902832, ‘porn’: 0.0008918801322579384, ‘sexy’: 0.0007902580546215177}}
onnx推理代码和推理结果:

import cv2
import numpy as np
import onnxruntimeIMAGE_DIM = 299  # required/default image dimensionalitydef load_single_image(image_path, image_size, verbose=True):try:if verbose:print(image_path, "size:", image_size)# Load image using OpenCVimage = cv2.imread(image_path)image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # Convert to RGBimage = cv2.resize(image, (image_size, image_size))# Preprocess the imageimage = image.astype(np.float32) / 255.0return np.expand_dims(image, axis=0), image_pathexcept Exception as ex:print("Image Load Failure: ", image_path, ex)return None, None# Load ONNX model
onnx_model_path = './models/model.onnx'
ort_session = onnxruntime.InferenceSession(onnx_model_path)# Example usage:
image_path_to_load = "images/20230903000800.jpg"
loaded_image, loaded_image_path = load_single_image(image_path_to_load, IMAGE_DIM)if loaded_image is not None:# Perform inferenceinput_name = ort_session.get_inputs()[0].nameoutput_name = ort_session.get_outputs()[0].nameinput_data = loaded_image# Run the ONNX modelresult = ort_session.run([output_name], {input_name: input_data})print(result[0].tolist())

images/20230903000800.jpg size: 299
[[0.004163397941738367, 0.00018479839491192251, 0.9918997287750244, 0.0020591376814991236, 0.0016930525889620185]]

结果不是很吻合,但也大差不差了。

转fp16 onnx

安装:

pip install 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('./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, './models/model_fp16.onnx')

推理结果:

images/20230903000800.jpg size: 299
[[0.004119873046875, 0.00018489360809326172, 0.99169921875, 0.002071380615234375, 0.001697540283203125]]
http://www.lryc.cn/news/228132.html

相关文章:

  • 高可用架构设计
  • qemu 之 uboot、linux 启动
  • C语言--每日五道选择题--Day8
  • Outlook如何删除邮箱账户
  • ultrascale+mpsoc系列的ZYNQ中DDR4参数设置说明
  • maven-六类属性
  • 微服务概念
  • 响应式摄影科技传媒网站模板源码带后台
  • 探索C#事件(Event)的强大应用
  • 学习c#的第四天
  • 解析JSON字符串:属性值为null的时候不被序列化
  • 短视频短剧小程序系统:用技术丰富你的碎片时间
  • 服务器数据恢复—磁盘出现坏道掉线导致raid5阵列崩溃的数据恢复案例
  • Android R.fraction
  • C语言精华题目锦集1
  • 头歌答案Python——JSON基础
  • TDengine 与煤科院五大系统实现兼容性互认,助力煤矿智能化安全体系搭建
  • 231030期就业班开班咯!我在前方护航,让你稳稳入职
  • 小白学安全-漏洞编号的理解 CVE/CAN/BUGTRAQ/CNCVE/CNVD/CNNVD
  • 助力燃气安全运行:智慧燃气管网背景延展
  • 低代码、零代码开源与不开源:区别解析
  • LabVIEW中如何在网络上使用远程VI服务器
  • Centos 7rc.local脚本命令开机不执行及指定用户启动的方法
  • mysql 的存储过程
  • http客户端简单demo
  • 解决UniAD在高版本CUDA、pytorch下运行遇到的问题
  • ADC、DMA以及串口之间的联系和区别?
  • jupyter lab配置列表清单
  • 爱发电 OAuth 登录 SDK for Remix
  • Wpf 使用 Prism 实战开发Day05