ONNX系列六 --- 在Java中使用可移植的ONNX AI模型
目录
安装和导入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中使用它。
微软与Facebook和AWS共同开发了ONNX。ONNX格式和ONNX运行时都具有行业支持,以确保所有重要框架都能够将其图形导出到ONNX,并且这些模型可以在任何硬件配置上运行。
ONNX Runtime是用于运行已转换为ONNX格式的机器学习模型的引擎。传统机器学习模型和深度学习模型(神经网络)都可以导出为ONNX格式。运行时可以在Linux,Windows和Mac上运行,并且可以在各种芯片体系结构上运行。它还可以利用诸如GPU和TPU之类的硬件加速器。但是,没有针对操作系统,芯片体系结构和加速器的每种组合的安装包,因此,如果不使用任何一种常见组合,则可能需要从源代码构建运行时。检查ONNX运行时网站以获得所需组合的安装说明。本文将展示如何在具有默认CPU的x64体系结构和具有GPU的x64体系结构上安装ONNX Runtime。
除了可以在许多硬件配置上运行之外,还可以从大多数流行的编程语言中调用运行时。本文的目的是展示如何在Java中使用ONNX Runtime。我将展示如何安装onnxruntime软件包。安装ONNX Runtime后,我会将先前导出的MNIST模型加载到ONNX Runtime中,并使用它进行预测。
安装和导入ONNX运行时
在使用ONNX运行时之前,您需要向构建工具中添加适当的依赖项。Maven资源库是为各种工具(包括Maven和Gradle)设置ONNX运行时的良好来源。要在具有默认CPU的x64架构上使用运行时,请参考下面的链接。
https://mvnrepository.com/artifact/org.bytedeco/onnxruntime-platform
要在带GPU的x64架构上使用运行时,请使用以下链接。
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 modelObject 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 inferencetry (OrtSession.Result results = session.run(container)) {// Only iterates oncefor (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数据集中发现的数字的方法。具体来说,有一些示例显示了如何在Keras,PyTorch,TensorFlow 1.0和TensorFlow 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
ONNX系列六 --- 在Java中使用可移植的ONNX AI模型相关推荐
- ONNX系列七 --- 在Python中使用可移植的ONNX AI模型
目录 安装和导入ONNX运行时 载入ONNX模型 使用ONNX运行时进行预测 摘要和后续步骤 参考文献 下载源547.1 KB 系列文章列表如下: ONNX系列一 --- 带有ONNX的便携式神经网络 ...
- Java NIO学习系列六:Java中的IO模型
前文中我们总结了linux系统中的5中IO模型,并且着重介绍了其中的4种IO模型: 阻塞I/O(blocking IO) 非阻塞I/O(nonblocking IO) I/O多路复用(IO multi ...
- ONNX系列五 --- 在C#中使用可移植的ONNX AI模型
目录 安装和导入ONNX运行时 载入ONNX模型 使用ONNX运行时进行预测 摘要和后续步骤 参考文献 下载源547.1 KB 系列文章列表如下: ONNX系列一 --- 带有ONNX的便携式神经网络 ...
- [Java高并发系列(5)][详细]Java中线程池(1)--基本概念介绍
1 Java中线程池概述 1.1 什么是线程池? 在一个应用当中, 我们往往需要多次使用线程, 这意味着我们需要多次创建和销毁线程.那么为什么不提供一个机制或概念来管理这些线程呢? 该创建的时候创建, ...
- (十六)java中的String
String:字符串类型,是java中最常用的引用类型,String是不可变的,java.lang.String是由final修饰,此类不可被继承. String是不可变的,指的是字符串 ...
- 六、Java中常用的API(通过包进行分类)————File类、IO流
一.util工具包下的补充类 介绍io包之前,先补充介绍几个常用的工具类 1.Scanner类 什么是Scanner类 一个可以解析基本类型和字符串的简单文本扫描器. 例如,以下代码使用户能够从 Sy ...
- 高薪程序员面试题精讲系列15之Java中的对象如何实现排序?
一. 面试题及剖析 1. 今日面试题 我们在项目开发时,有时候会遇到列表搜索查询等效果,其中大部分都可以利用SQL语句来实现,但也有些特殊的搜索排序利用SQL是很难实现的,比如对中文进行排序.说到排序 ...
- 【 史上最坑爹的Java代码系列02 】Java中的三种代码块
Java中有三种代码块,三种代码块中的代码执行的优先级是面试中会被提问到的问题. 三种代码块:静态代码块.方法代码块.普通代码块 其中,普通代码块是比较少见而且比较少使用的. package com. ...
- Java系列:关于Java中的桥接方法
这两天在看<Java核心技术 卷1>的泛型相关章节,其中说到了在泛型子类中override父类的泛型方法时,编译器会自动生成一个桥接方法,这块有点看不明白. 书上的例子代码如下: publ ...
最新文章
- NVIDIA数据中心深度学习产品性能
- 深度学习中GPU和显存分析
- 昨天又帮爸DIY了一台工作电脑
- 银光甘特图/日历图/排程控件GTP.NET for Silverlight介绍及正版下载
- 初学Java Web开发,请远离各种框架,从Servlet开发
- leetcode 91. Decode Ways | 91. 解码方法(动态规划)
- ASP.NET Core中使用GraphQL - 第二章 中间件
- 《C++ Primer》7.4节练习
- Kali Linux 无线渗透测试入门指南 第八章 攻击企业级 WPA 和 RADIUS
- 暗影之枪显示连接服务器失败,暗影之枪传奇进不去怎么办?游戏更新进不去问题详解[多图]...
- 传统语音识别(GMM+HMM)
- wait, notify, notifyAll
- struts2 tag if NumberFormatException
- 面试中常被问到(七)封装继承多态知多少
- harry-用while循环画对称图形
- python基础-15-列表推导式
- JAVA一些实例实战
- 奥鹏计算机19在线作业答案,东师计算机应用基础19春在线作业1【标准答案】
- 贝叶斯统计 韦来生 课后题答案 第一章
- 天美服务器未响应,王者荣耀服务器上热搜,无数玩家遭遇掉线烦恼,天美该怎么办?...
热门文章
- android 坐标布局变形,Android:scrollBy实现view随意移动并显示坐标
- 开门红讨采头,开工喜庆红色PSD分层海报模板
- 如果你还在寻找完美的海报字体, 你很幸运看这里!
- UI设计素材|切换动效,打破界面沉闷感
- UI设计素材干货|可临摹的时尚播放页面模板
- python输入正整数n、求n以内能被17整除的最大正整数_求100之内自然数中最大的能被17整除的数资料...
- Linux如何处理 Too many open files
- ZeroMQ简介:一种高性能的异步消息传递库
- 10款炫酷的HTML5动画特效
- C++友元:友元函数、友元类和友元成员函数