首页 > 编程语言 >如何使用Java操作TensorFlow

如何使用Java操作TensorFlow

时间:2023-05-10 11:45:11浏览次数:46  
标签:Java Python graph 张量 API 操作 TensorFlow

https://blog.csdn.net/weixin_28906733/article/details/100528526

简介

机器学习在全球范围内越来越受欢迎和使用。 它已经彻底改变了某些应用程序的构建方式,并且可能会继续成为我们日常生活中一个巨大的(并且正在增加的)部分。
没有什么包装且机器学习并不简单。 它对许多人来说似乎非常复杂并常常令人生畏。
像谷歌这样的公司将自己的机器学习概念与开发人员联系起来,在谷歌帮助下让他们逐渐迈出第一步,故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的一个很好的开始。

标签:Java,Python,graph,张量,API,操作,TensorFlow
From: https://www.cnblogs.com/jockming/p/17387511.html

相关文章

  • JavaWeb回顾与小结(七)
    事务管理事务回顾概念事务是一组操作的集合,它是一个不可分割的工作单位,这些操作要么同时成功,要么同时失败操作开启事务starttransaction/begin一组操作开始前,开启事务提交事务commit这组操作全部成功后,提交事务回滚事务rollback中间任何一个操作出现异常,回滚......
  • Tensorflow环境搭建教程
    前言笔者在搭建tensorflow环境时遇到了很多问题,浪费了很多时间,为方便想学习机器学习的同学搭建tensorflow环境,笔者整理了一份教程供读者参考。不能直接修改anaconda里的python版本了,另一种更简单的方法:Win10系统用anaconda新建一个tensorflow环境小白教程.一、下载anaconda......
  • linux下拆分PDF、批量裁剪图片及合并为PDF操作
    好久不碰代码,文件操作啥的快忘光了(你丫本来就没怎么学吧!)我先放两串代码在这QAQ拆分PDFpdftoppm-png?.pdfs批量裁剪图片裁剪图片指令,这个指令是ImageMagick带的一个什么东西,单位电脑能装convertsrc.png-crop长x高+起始像素点横坐标+起始像素低纵坐标dest.png然后......
  • deb包得一些操作
    第一步:先打开原有的deb的包 这将会创建一个名为example的目录,并将deb软件包解压缩到其中。第二个命令将会解压缩DEBIAN目录,其中包含了软件包的控制文件。 第二步:修改我们需要修改的东西,如替换一些进程第三步:将修改之后的文件打包成deb的包dpkg-deb-bexampleexample-n......
  • 聊聊那些年我们实现java AOP几种常见套路
    前言有一定开发经验的同学对AOP应该很了解吧,如果不了解,可以先查看如下文章进行科普一下https://baike.baidu.com/item/AOP/1332219?fr=aladdin,再来阅读本文。示例前置准备注:本示例基于springboot进行演示1、在项目pom引入aop的GAV<dependency><groupId>or......
  • Java使用wkhtmltopdf实现HTML转pdf
    wkhtmltopdf设置全屏:wkhtmltopdf--disable-smart-shrinking--page-sizeA4-B0-L0-R0-T0test.htmloutput.pdf-B-T-R-L是有效果的,$snappy->setOption('margin-top','0mm');$snappy->setOption('margin-left','0mm'......
  • 界面控件DevExtreme使用指南 - 控制折叠操作 & 键盘支持
    DevExtreme拥有高性能的HTML5/JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NETCore,jQuery,Knockout等)构建交互式的Web应用程序,该套件附带功能齐全的数据网格、交互式图表小部件、数据编辑器等。请注意:在开始本教程之前,请确保DevExtreme已安装在Angula......
  • Java OOP 练习--银行客户管理
    AcountpublicclassAcount{privatedoublebalance;//余额//带参构造器publicAcount(doubleinitBalance){this.balance=initBalance;}//查询余额publicdoublegetBalance(){returnbalance;}//存钱......
  • Jquery操作select汇总
    转载:http://www.cnblogs.com/pepcod/archive/2012/07/03/JavaScript.html//Query获取Select选择的Text和Value:$("#select_id").change(function(){//code...});//为Select添加事件,当选择其中一项时触发varcheckText=$("#select_id").find("option:selected&qu......
  • JavaScript 和浏览器
    模块参见ES6部分DOM参见Web相关部分选择器document.querySelector()来获取网页的对应HTML元素document.querySelectorAll()来获取网页的所有对应HTML元素document.getElementById()根据ID获取元素document.getElementsByClassName()根据类名获取元素docum......