使用Java操作TensorFlow的方法
作者:itwetouch 发布时间:2023-11-27 21:31:38
简介
机器学习在全球范围内越来越受欢迎和使用。 它已经彻底改变了某些应用程序的构建方式,并且可能会继续成为我们日常生活中一个巨大的(并且正在增加的)部分。
没有什么包装且机器学习并不简单。 它对许多人来说似乎非常复杂并常常令人生畏。
像谷歌这样的公司将自己的机器学习概念与开发人员联系起来,在谷歌帮助下让他们逐渐迈出第一步,故TensorFlow的框架诞生了。
TensorFlow为何物?
TensorFlow是由谷歌使用Python和C++开发的开源机器学习框架。
它可以帮助开发人员轻松获取数据,准备和训练模型,预测未来状态,以及执行大规模机器学习。
有了它,我们可以训练和运行深度神经网络的内容,诸如光学字符识别,图像识别/分类,自然语言处理等。
张量与操作
TensorFlow基于计算图,你可以将其想象为具有节点和边的经典图。
每个节点被称为操作,它们将零个或多个张量输入并产生零个或多个张量输出。 操作可以非常简单,例如基本的添加,但它们也可以非常复杂。
张量被描绘为图的边缘,并且是核心数据单元。 当我们将它们提供给操作时,我们在这些张量上执行不同的功能。 它们可以具有单个或多个维度,有时也称为它们的等级(标量:等级0,向量:等级1,矩阵:等级2)。
这些数据受到操作的影响通过张量传递到计算图中,故而称为TensorFlow。
张量可以以任意数量的维度存储数据,并且有三种主要类型的张量:占位符,变量和常量。
安装TensorFlow
使用Maven,安装TensorFlow就像包含依赖项一样简单:
<dependency>
<groupId>org.tensorflow</groupId>
<artifactId>tensorflow</artifactId>
<version>1.15.0</version>
</dependency>
如果你的设备支持GPU功能,可以添加以下依赖:
<dependency>
<groupId>org.tensorflow</groupId>
<artifactId>libtensorflow</artifactId>
<version>1.15.0</version>
</dependency>
<dependency>
<groupId>org.tensorflow</groupId>
<artifactId>libtensorflow_jni_gpu</artifactId>
<version>1.15.0</version>
</dependency>
你可以使用TensorFlow对象来检查当前操作的TensorFlow的版本。
System.out.println(TensorFlow.version());
TensorFlow的JavaAPI
Java API TensorFlow提供包含在org.tensorflow包中。 它目前是实验性的,因此不能保证其稳定性。
需要注意的是TensorFlow唯一完全支持的语言是Python,Java API几乎没有什么功能。
API向我们介绍了新的类,接口,枚举和异常。
类
通过API引入的新类是:
Graph:表示TensorFlow计算的数据流图;
Operation:在Tensors上执行计算的Graph节点;
OperationBuilder:Operations的构建器类;
Output:操作产生的张量的符号句柄;
SavedModelBundle:表示从存储加载的模型;
SavedModelBundle.Loader:提供加载SavedModel的选项;
Server:进程内TensorFlow服务器,用于分布式训练;
Session:图形执行的驱动程序;
Session.Run:输出执行会话时获得的张量和元数据;
Session.Runner:运行操作并评估张量;
Shape:由操作产生的可能部分已知的张量形状;
Tensor:静态类型的多维数组,其元素是由T描述的类型;
TensorFlow:描述TensorFlow运行时的静态实用程序方法;
Tensors:用于创建张量对象的类型安全工厂方法;
枚举
DataType:将张量中的元素类型表示为枚举;
接口
Operand:由TensorFlow操作的操作数实现的接口;
异常
TensorFlowException:执行TensorFlow图时抛出的未经检查的异常
如果我们将所有这些与Python中的tf模块进行比较将发现存在明显的区别。 Java API没有几乎相同的功能,至少目前如此。
图(Graphs)
如前所述,TensorFlow基于计算图 - 其中org.tensorflow.Graph是Java的实现。
注意:它的实例是线程安全的,尽管我们需要在完成它之后显式释放Graph使用的资源。
让我们从一个空图开始:
Graph graph = new Graph();
该对象是空的,所以这个图表意义不大。 要对它做任何操作,我们首先需要使用Operations加载它。
我们使用opBuilder()方法来加载它,它返回一个OperationBuilder对象,一旦我们调用.build()方法,它就会将操作添加到我们的图形中。
常量
让我们在图表中添加一个常量:
Operation x = graph.opBuilder("Const", "x")
.setAttr("dtype", DataType.FLOAT)
.setAttr("value", Tensor.create(3.0f))
.build();
占位符
占位符是变量的“类型”,声明时没有赋值,他们的值将在之后进行分配。 这允许我们使用没有任何实际数据的操作来构建图形:
Operation y = graph.opBuilder("Placeholder", "y")
.setAttr("dtype", DataType.FLOAT)
.build();
函数
最后为了解决这个问题,我们需要添加某些函数。 这些可以像乘法,除法或加法一样简单,也可以像矩阵乘法一样复杂。 和之前一样,我们使用.opBuilder()方法定义函数:
Operation xy = graph.opBuilder("Mul", "xy")
.addInput(x.output(0))
.addInput(y.output(0))
.build();
注意:我们使用input(0)作为张量可以有多个输出。
图形可视化
遗憾的是,Java API还没有包含任何允许像Python中一样可视化图形的工具。
会话(Sessions)
如前所述,Session是Graph的驱动程序。 它封装了执行Operation和Graph计算张量(tensors)的环境。
这意味着我们构建的图(graph)中的张量(tensors)实际上并没有任何值,因为我们没有在会话(session)中运行图形(graph)。
我们首先将图表添加到会话(session)中:
Session session = new Session(graph);
我们的操作知识简单地将x于y相乘,为了运行我们的图(graph)并得到计算结果,我们需要使用fetch()获取到xy的操作并为其提供x和y的值:
Tensor tensor = session.runner().fetch("xy").feed("x", Tensor.create(5.0f)).feed("y", Tensor.create(2.0f)).run().get(0);
System.out.println(tensor.floatValue());
运行这段代码将产生的结果如下:
10.0f
Java当中加载Python中Saving模块
这可能听起来有点奇怪,但由于Python是唯一受到良好支持的语言,因此Java API仍然没有保存模型的功能。
这意味着Java API仅用于服务用例,至少在TensorFlow完全支持之前。 目前至少我们可以使用SavedModelBundle类在Python中训练和保存模型,然后使用Java加载它们来为它们提供服务:
SavedModelBundle model = SavedModelBundle.load("./model", "serve");
Tensor tensor = model.session().runner().fetch("xy").feed("x", Tensor.create(5.0f)).feed("y", Tensor.create(2.0f)).run().get(0);
System.out.println(tensor.floatValue());
结论
TensorFlow是一个功能强大且广泛使用的框架。 它不断得到改进,并最近被引入新语言:包括Java和JavaScript。
尽管Java API还没有像TensorFlow在Python中那么多的功能,但它仍然可以作为向Java开发人员介绍TensorFlow的一个很好的开始。
来源:https://www.cnblogs.com/jockming/p/17387511.html
猜你喜欢
- 在本博客中,可以找到一篇《c#实现输出的字符靠右对齐的示例》它有教大家怎样实现字符串输出进行左齐或者是右对齐。本篇的方法,超简单,是使用st
- 本文实例讲述了Spring实战之ResourceLoader接口资源加载用法。分享给大家供大家参考,具体如下:一 代码package lee
- java 接口回调实例详解首先官方对接口回调的定义是这样的,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,
- 本文实例为大家分享了java实现文件下载的具体代码,供大家参考,具体内容如下public HttpServletResponse downl
- java 中HttpClient传输xml字符串实例详解介绍:我现在有一个对象page,需要将page对象转换为xml格式并以binary方
- 一、实验目的1. 掌握输入输出流的总体结构;2. 掌握流的概念;3. 掌握FileInputStream类、FileOutputStream
- 在android开发中,经常会遇到一个view需要它能够支持滑动的需求。下面通过本篇文章给大家介绍android view移动的六种方法。l
- 一、定义实体类Person,封装生成的数据package net.dc.test;public class Person { private
- java 实现MD5加密算法的简单实例实现代码:import java.security.NoSuchAlgorithmException;
- 背景接上文《失踪人口回归,mybatis-plus 3.3.2 发布》[1] ,提供了一个非常实用的功能 「数据安全保护」 功能,不仅支持数
- 前文本章是关于Java流程控制语句的最全汇总,本篇为汇总中篇。流程是人们生活中不可或缺的一部分,它表示人们每天都在按照一定的流程做事。比如出
- 本文实例讲述了java生成XML的方法。分享给大家供大家参考,具体如下:下拉框的生成,我是通过javascript读取xml文件生成的。Xm
- java.util.concurrent包中的工具实现核心都是AQS,了解ReentrantLock的实现原理,需要先分析AQS以及AQS与
- 本文实例讲述了C#启动进程的几种常用方法。分享给大家供大家参考。具体如下:1.启动子进程,不等待子进程结束private void simp
- 最新开发新项目的时候,要做分享项目,要求分享有微信,微信朋友圈,QQ,QQ空间,新浪微博这五个,所分享内容包括,分享纯图片,纯文字,图文类型
- 一、打印直角三角形这个循环控制打印十行空格for (int x = 1; x <= 10; x++) {//因为要打印一个十行的直角三
- 本文实例为大家分享了Android绝对布局AbsoluteLayout的具体代码,供大家参考,具体内容如下1>AbsoluteLayo
- 1. 前言Spring除了IOC和DI,还有另一个杀手锏功能——Spring AOP。AOP是一种面
- 代码如下:try { // 创建一个线程 Thread thread = new Thread() {
- 阿里、华为、腾讯Java技术面试题精选,具体内容如下JVM的类加载机制是什么?有哪些实现方式?类加载机制:类的加载指的是将类的.class文