ONNX系列六 --- 在Java中使用可移植的ONNX AI模型

2023-05-16

目录

安装和导入ONNX运行时

载入ONNX模型

使用ONNX运行时进行预测

摘要和后续步骤

参考文献


  • 下载源547.1 KB

系列文章列表如下:

ONNX系列一 --- 带有ONNX的便携式神经网络

ONNX系列二 --- 使用ONNX使Keras模型可移植

ONNX系列三 --- 使用ONNX使PyTorch AI模型可移植

ONNX系列四 --- 使用ONNX使TensorFlow模型可移植

ONNX系列五 --- 在C#中使用可移植的ONNX AI模型

ONNX系列六 --- 在Java中使用可移植的ONNX AI模型

ONNX系列七 --- 在Python中使用可移植的ONNX AI模型

在关于2020年使用便携式神经网络的系列文章中,您将学习如何在x64架构上安装ONNX并在Java中使用它。

微软与FacebookAWS共同开发了ONNXONNX格式和ONNX运行时都具有行业支持,以确保所有重要框架都能够将其图形导出到ONNX,并且这些模型可以在任何硬件配置上运行。

ONNX Runtime是用于运行已转换为ONNX格式的机器学习模型的引擎。传统机器学习模型和深度学习模型(神经网络)都可以导出为ONNX格式。运行时可以在LinuxWindowsMac上运行,并且可以在各种芯片体系结构上运行。它还可以利用诸如GPUTPU之类的硬件加速器。但是,没有针对操作系统,芯片体系结构和加速器的每种组合的安装包,因此,如果不使用任何一种常见组合,则可能需要从源代码构建运行时。检查ONNX运行时网站以获得所需组合的安装说明。本文将展示如何在具有默认CPUx64体系结构和具有GPUx64体系结构上安装ONNX Runtime

除了可以在许多硬件配置上运行之外,还可以从大多数流行的编程语言中调用运行时。本文的目的是展示如何在Java中使用ONNX Runtime。我将展示如何安装onnxruntime软件包。安装ONNX Runtime后,我会将先前导出的MNIST模型加载到ONNX Runtime中,并使用它进行预测。

安装和导入ONNX运行时

在使用ONNX运行时之前,您需要向构建工具中添加适当的依赖项。Maven资源库是为各种工具(包括MavenGradle)设置ONNX运行时的良好来源。要在具有默认CPUx64架构上使用运行时,请参考下面的链接。

https://mvnrepository.com/artifact/org.bytedeco/onnxruntime-platform

要在带GPUx64架构上使用运行时,请使用以下链接。

https://mvnrepository.com/artifact/org.bytedeco/onnxruntime-platform-gpu

一旦安装了运行时,就可以使用如下所示的import语句将其导入到Java代码文件中。引入TensorProto工具的import语句将帮助我们为ONNX模型创建输入,也将有助于解释ONNX模型的输出(预测)。

import ai.onnxruntime.OnnxMl.TensorProto;
import ai.onnxruntime.OnnxMl.TensorProto.DataType;
import ai.onnxruntime.OrtSession.Result;
import ai.onnxruntime.OrtSession.SessionOptions;
import ai.onnxruntime.OrtSession.SessionOptions.ExecutionMode;
import ai.onnxruntime.OrtSession.SessionOptions.OptLevel;

载入ONNX模型

以下代码段显示了如何将ONNX模型加载到以Java运行的ONNX Runtime中。此代码创建可用于进行预测的会话对象。这里使用的模型是从PyTorch导出的ONNX模型。

这里有几件事值得注意。首先,您需要查询会话以获取其输入。这是使用会话的getInputInfo方法完成的。我们的MNIST模型只有一个输入参数:784个浮点数组,代表MNIST数据集中的一张图像。如果您的模型有多个输入参数,则InputMetadata的每个参数都有一个条目。

Utilities.LoadTensorData();
String modelPath = "pytorch_mnist.onnx";

try (OrtSession session = env.createSession(modelPath, options)) {
   Map<String, NodeInfo> inputMetaMap = session.getInputInfo();
   Map<String, OnnxTensor> container = new HashMap<>();
   NodeInfo inputMeta = inputMetaMap.values().iterator().next();

   float[] inputData = Utilities.ImageData[imageIndex];
   string label = Utilities.ImageLabels[imageIndex];
   System.out.println("Selected image is the number: " + label);

   // this is the data for only one input tensor for this model
   Object tensorData =
            OrtUtil.reshape(inputData, ((TensorInfo) inputMeta.getInfo()).getShape());
   OnnxTensor inputTensor = OnnxTensor.createTensor(env, tensorData);
   container.put(inputMeta.getName(), inputTensor);

   // Run code omitted for brevity.

}

 

上面的代码未显示用于读取原始MNIST图像并将每个图像转换为784个浮点数组的实用程序。还可以从MNIST数据集中读取每个图像的标签,以便可以确定预测的准确性。该代码是标准Java代码,但仍然鼓励您检出并使用它。如果您需要读入与MNIST数据集相似的图像,它将节省您的时间。

使用ONNX运行时进行预测

以下函数说明了如何使用在加载ONNX模型时创建的ONNX会话。

try (OrtSession session = env.createSession(modelPath, options)) {

   // Load code not shown for brevity.

   // Run the inference
   try (OrtSession.Result results = session.run(container)) {

      // Only iterates once
      for (Map.Entry<String, OnnxValue> r : results) {
         OnnxValue resultValue = r.getValue();
         OnnxTensor resultTensor = (OnnxTensor) resultValue;
         resultTensor.getValue()
         System.out.println("Output Name: {0}", r.Name);
         int prediction = MaxProbability(resultTensor);
         System.out.println("Prediction: " + prediction.ToString());
	}
   }
}

大多数神经网络不会直接返回预测。它们返回每个输出类的概率列表。对于我们的MNIST模型,每个图像的返回值将是10个概率的列表。可能性最高的条目是预测。您可以做一个有趣的测试,将ONNX模型在创建模型的框架中运行时返回的概率与从原始模型返回的概率进行比较。理想情况下,模型格式和运行时的更改不应更改所产生的任何概率。这将使每当模型发生更改时都可以运行良好的单元测试。

摘要和后续步骤

在本文中,我简要介绍了ONNX运行时和ONNX格式。然后,我展示了如何在ONNX运行时中使用Java加载和运行ONNX模型。

本文的代码示例包含一个工作的Console应用程序,该应用程序演示了此处显示的所有技术。此代码示例是Github存储库的一部分,该存储库探讨了使用神经网络预测MNIST数据集中发现的数字的方法。具体来说,有一些示例显示了如何在KerasPyTorchTensorFlow 1.0TensorFlow 2.0中创建神经网络。

如果您想了解有关导出为ONNX格式和使用ONNX Runtime的更多信息,请查阅本系列的其他文章。

参考文献

  • https://microsoft.github.io/onnxruntime/
  • https://microsoft.github.io/onnxruntime/
  • https://github.com/microsoft/onnxruntime/blob/master/docs/Java_API.md#getting-started
  • https://github.com/keithpij/onnx-lab
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ONNX系列六 --- 在Java中使用可移植的ONNX AI模型 的相关文章

  • 【C语言】输入圆的半径,求解圆的周长和面积

    公式 xff1a C 61 2 r S 61 r 代码 xff1a include lt stdio h gt int main float r PI PI 61 3 14159 printf 34 请输入圆的半径 xff1a n 34 s
  • 【C语言】输入一个年份和月份,输出该月的天数

    分析 xff1a 三种类型 xff0c A 2月比较特殊 xff0c 平年的2月只有28天 xff0c 而闰年的2月有 29 天 xff1b B 4 6 9 11月 xff1b C 其他1 3 5 7 8 10 12月 代码 xff1a 输
  • 一个C语言程序是由( )组成?

    A 一个主程序和若干子程序组成 B 一个或多个函数组成 C 若干过程组成 D 若干子程序组成 正确答案 B 解析 解析 一个C源程序是由一个main函数和若干个其他函数组成的 函数是C程序的基本单位 xff0c 被调用的函数可以是系统提供的
  • 【Python】Tkinter教程

    什么是Tkinter xff1f Tkinter 是 Python 的标准 GUI 库 Python 使用 Tkinter 可以快速的创建 GUI 应用程序 由于 Tkinter 是内置到 python 的安装包中 只要安装好 Python
  • 【C语言】解决error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead...

    几天编译文件的时候报错 xff0c 编译出错信息 xff1a 错误 1 error C4996 39 fopen 39 This function or variable may be unsafe Consider using fopen
  • 【C语言】数据结构C语言版 实验7 二叉树

    编写算法函数void preorder1 bintree t 实现二叉树t的非递归前序遍历 include 34 bintree h 34 char a 61 34 ABC D E F 34 扩充二叉树序树t的前序序列 函数preorder
  • 让input标签的range属性显示数值

    lt input type 61 34 range 34 name 61 34 salary 34 max 61 34 20 34 min 61 34 15 34 onchange 61 34 document getElementById
  • 【Linux】安装x11vnc和xrdp,使用windows远程deepin

    一 环境准备 1 已安装deepin 虚拟机或物理机 xff0c 安装教程自行查询 xff0c 很简单 xff0c 此处用的开源版deepin20 1做测试 目前已更新到20 2 2 启用root账号 xff0c 终端执行 xff1a su
  • 吐血整理,Ubuntu必备应用推荐,满满的干货!

    吐血整理 xff0c Ubuntu必备应用推荐 xff0c 满满的干货 xff01 哈喽 xff0c 大家好 xff0c 欢迎收看欢哥TV 我是欢哥 无论你是刚接触Ubuntu xff0c 还是最近从Windows改用Ubuntu xff0
  • Proxmox VE(PVE)添加硬盘做存储

    PVE安装后会默认将系统盘分出local和local lvm xff0c 但有时还需要别的硬盘作为虚拟主机的数据盘 xff0c 所以就需要添加硬盘进行扩充 一 硬盘分区 格式化 首先需要先先看下需添加硬盘的设备名称 xff0c 如下图的 d
  • 差分约束 解决区间选点问题

    题意 xff1a 给定一个数轴上的 n 个区间 xff0c 要求在数轴上选取最少的点使得第 i 个区间 ai bi 里至少有 ci 个点 input 输入第一行一个整数 n 表示区间的个数 xff0c 接下来的 n 行 xff0c 每一行两
  • 【已解决】Microsoft Visual C++ Redistributable is not installed

    Error 导入torch xff0c 提示报错 xff1a Microsoft Visual C 43 43 Redistributable is not installed this may lead to the DLL load f
  • 设置让Windows每天在指定时间自动关机

    其实我们的电脑是可以设置每天在指定的时间点自动关机的 xff0c 具体操作方法 xff1a 1 开打电脑 xff0c 点击电脑系统左下角windows图标 xff0c 选择 控制面板 并进入 xff1b 如图 2 在控制面板界面找到 管理工
  • 在 AlmaLinux 9安装Docker Compose

    首先先安装Docker 如何在 AlmaLinux 8 上安装和使用 Docker 检查Docker版本 docker version 安装Docker Compose sudo curl L 34 https github com doc
  • 使用python搭建一个简单的FTP服务器

    从配置文件获取访问FTP服务器目录的用户名 密码 span class token keyword from span pyftpdlib span class token punctuation span authorizers span
  • 更改win10系统C:\Users\中文用户名为英文用户名

    文章目录 前言一 打开注册表二 查找路径三 重启电脑四 将用中文名与英文名进行链接五 测试是否成功 前言 注意 xff1a 做之前请先浏览一遍 xff0c 做任何操作之前都建议不要直接就做 xff0c 先看一看文档中有哪些操作点是需要小心的
  • Cityscapes数据集的深度完整解析

    cityscapes数据集是分割模型训练时比较常用的一个数据集 xff0c 他还可以用来训练GAN网络生成街景图片 数据集下载和文件夹组成 xff1a 整个数据集包含50个欧洲城市 xff0c 5000张精细标注图像 标注位于gtFine文
  • 使用分支——处理Git merge 冲突

    使用分支 处理Git merge 冲突 版本控制系统就是负责管理来自于多个提交者 xff08 通常是开发者 xff09 之间的提交的 有时候多个开发者可能会编辑同一部分内容 一旦开发者A编辑了开发者B正在编辑的内容 xff0c 冲突就会产生
  • 纯手工解密几大在线js加密网站(1)

    0x0 开头 最近闲来无事 xff0c 来看一下目前网络上哪家加密工具的强度最高的 本人技术有限 xff0c 最终结果不能代表什么 xff0c 大家有遇到什么其他的js加密技术破解难题的 xff0c 也可以一起互相讨论 xff0c 也可以问
  • 纯手工解密几大在线js加密网站(3)

    0x0 开头 续接上章 xff0c 心血来潮想挨个破解一下各大js加密的网站 xff0c 了解一下现有的js加密的逻辑 0x1 介绍 Sojson支持js的不可逆混淆加密 xff0c 和很多高级的加密配置 xff0c 还增加了小白专用的一键

随机推荐

  • 如何在局域网内设置多个网段

    连接状态中的 属性 按钮 xff0c 选择 TCP IPv4 协议 xff0c 点击下面的 属性 按钮 xff0c 点击 高级 按钮 在高级TCP IP设置里面点击 添加 按钮 输入新网段的ip地址 xff08 以192网段为例 xff09
  • B-猫猫向前冲(拓扑排序

    题意 xff1a input 输入有若干组 xff0c 每组中的第一行为二个数N xff08 1 lt 61 N lt 61 500 xff09 xff0c M xff1b 其中N表示猫猫的个数 xff0c M表示接着有M行的输入数据 接下
  • 配置wsl2的图形界面

    1 更新源 span class token function sudo span span class token function apt get span update span class token function sudo s
  • 关于yyyyMMdd的正则表达式的使用

    String pattern 61 34 0 9 3 1 9 0 9 2 1 9 0 9 1 0 9 1 1 9 0 9 2 1 9 0 9 3 34 43 34 0 13578 1 02 0 1 9 12 0 9 3 01 0 469 1
  • qt下使用opencascade源代码

    c 43 43 基础太弱 xff0c 纠正一下 xff0c 在PRO中使用包含目录就可以使用 lt gt xff0c 将下载的opencascade文件通过make编译和安装 xff0c 添加引用就可以了 如果你依然对以下没用的操作感兴趣
  • Linux系统下CPU频率的调整

    省电 or 流畅 root 64 android sys devices system cpu cpu0 cpufreq cat scaling available governors hotplug conservative ondema
  • 禁止显示Apache目录列表-Indexes FollowSymLinks

    第一种方法 禁止显示Apache目录列表 Indexes FollowSymLinks 如何修改目录的配置以禁止显示 Apache 目录列表 缺省情况下如果你在浏览器输入地址 xff1a http localhost 8080 如果你的文件
  • 第十一章、远程联机服务器SSH / XDMCP / VNC / RDP

    维护网络服务器最简单的方式不是跑去实体服务器前面登入 xff0c 而是透过远程联机服务器联机功能来登入主机 xff0c 然后再来进行其他有的没的维护就是了 Linux 主机几乎都会提供 sshd 这个联机服务 xff0c 而且这个服务还是主
  • 如何查看电脑jdk/jre版本以及安装路径

    一 按快捷键win 43 r打开运行窗口 二 输入cmd 回车 xff0c 打开命令框 三 输入 java version 查看jdk版本 注意 xff1a java后面需要有空格 xff0c 不然会报错 java span class t
  • AndroidID、IMEI、OAID获取

    前言 因为项目中经常会遇到要上传一系列设备信息的功能 xff0c 为了方便使用 xff0c 所以就拆分成以下系列文章来单独介绍如何获取各类设备信息 手机运营商获取 AndroidID IMEI OAID获取 地理位置信息经纬度获取 公网IP
  • (二)裸机汇编--点亮LED

    目标 xff1a 点亮LED 1 查数据手册 硬件图中 xff0c 找到LED灯对应的GPIO 从二极管方向看出 xff0c 端口输出低电平时 xff0c 电流经过 xff0c LED点亮 再到数据手册查找对应的寄存器 GPBCON xff
  • Excel中将十六进制字符串转换为汉字的方法

    比如十六进制字符串 D0C2BDAE 转换方法是 在公式里面输入 61 CHAR HEX2DEC LEFT C6 4 amp CHAR HEX2DEC MID C6 5 4 其中C6 是十六进制所在的单元格 xff0c 原理很简单 xff0
  • C - 班长竞选(Kosaraju算法

    题意 xff1a input 本题有多组数据 第一行 T 表示数据组数 每组数据开始有两个整数 N 和 M 2 lt 61 n lt 61 5000 0 lt m lt 61 30000 xff0c 接下来有 M 行包含两个整数 A 和 B
  • debian 11安装pip

    安装curl sudo apt get install curl下载文件get pip py curl https bootstrap pypa io get pip py o get pip py安装依赖python3 distutils
  • Linux运行jar包报错:Error:Invalid or corrupt jarfile xxx.jar

    各种查找 xff0c 没有对症的 xff0c 最后仔细查看信息提示发现是自己大意造成的 xff0c 原因是服务器空间不足导致保存传递过来的jar包不完整导致的 巨坑 xff01 怪自己不够仔细
  • [HPM] Error occurred while trying to proxy request /login/account from localhost:8000 to localhost:8

    HPM Error occurred while trying to proxy request login account from localhost 8000 to localhost 8888 api ENOTFOUND https
  • Unable to perform this action because the process is running.

    总感觉会有小伙伴和我一样纠结吧 我在使用vs code的时候想用调试控制台输入输出 xff0c 结果在输入的时候遇到了这个问题 xff0c 为什么呢 xff0c 我也不知道 xff0c 但是有一个是明确的 xff0c 就是调试控制台不可以作
  • VS Code 翻译插件

    translate var 使用翻译api将其他语言到英文 转换成常见的变量命名形式 Automatically translate words into English variable name Keybindings win 34 A
  • 从ASP.NET Core 3.1中的当前URL获取主机信息

    目录 介绍 问题陈述 解决方案 介绍 在处理 Web 应用程序时 xff0c 很自然 xff0c 我们需要在产品生命周期的各个阶段在各种环境 xff08 即开发 xff0c 测试 xff0c 生产等 xff09 之间切换 换句话说 xff0
  • ONNX系列六 --- 在Java中使用可移植的ONNX AI模型

    目录 安装和导入ONNX运行时 载入ONNX模型 使用ONNX运行时进行预测 摘要和后续步骤 参考文献 下载源547 1 KB 系列文章列表如下 xff1a ONNX系列一 带有ONNX的便携式神经网络 ONNX系列二 使用ONNX使Ker