机器学习在全球范围内愈来愈受欢迎和使用。 它已经完全改变了某些应用程序的构建方式,而且可能会继续成为咱们平常生活中一个巨大的(而且正在增长的)部分。没有什么包装且机器学习并不简单。 它对许多人来讲彷佛很是复杂并经常使人生畏。像谷歌这样的公司将本身的机器学习概念与开发人员联系起来,在谷歌帮助下让他们逐渐迈出第一步,故TensorFlow的框架诞生了。java
TensorFlow是由谷歌使用Python和C++开发的开源机器学习框架。它能够帮助开发人员轻松获取数据,准备和训练模型,预测将来状态,以及执行大规模机器学习。有了它,咱们能够训练和运行深度神经网络的内容,诸如光学字符识别,图像识别/分类,天然语言处理等。数组
TensorFlow基于计算图,你能够将其想象为具备节点和边的经典图。每一个节点被称为操做,它们将零个或多个张量输入并产生零个或多个张量输出。 操做能够很是简单,例如基本的添加,但它们也能够很是复杂。张量被描绘为图的边缘,而且是核心数据单元。 当咱们将它们提供给操做时,咱们在这些张量上执行不一样的功能。 它们能够具备单个或多个维度,有时也称为它们的等级(标量:等级0,向量:等级1,矩阵:等级2)。这些数据受到操做的影响经过张量传递到计算图中,故而称为TensorFlow。张量能够以任意数量的维度存储数据,而且有三种主要类型的张量:占位符,变量和常量。安全
使用Maven,安装TensorFlow就像包含依赖项同样简单:服务器
<dependency>
<groupId>org.tensorflow</groupId>
<artifactId>tensorflow</artifactId>
<version>1.13.1</version>
</dependency>复制代码
若是你的设备支持GPU功能,能够添加如下依赖:网络
<dependency>
<groupId>org.tensorflow</groupId>
<artifactId>libtensorflow</artifactId>
<version>1.13.1</version>
</dependency>
<dependency>
<groupId>org.tensorflow</groupId>
<artifactId>libtensorflow_jni_gpu</artifactId>
<version>1.13.1</version>
</dependency>复制代码
你可使用TensorFlow对象来检查当前操做的TensorFlow的版本。session
System.out.println(TensorFlow.version());复制代码
Java API TensorFlow提供包含在org.tensorflow包中。 它目前是实验性的,所以不能保证其稳定性。须要注意的是TensorFlow惟一彻底支持的语言是Python,Java API几乎没有什么功能。API向咱们介绍了新的类,接口,枚举和异常。框架
经过API引入的新类是:机器学习
若是咱们将全部这些与Python中的tf模块进行比较将发现存在明显的区别。 Java API没有几乎相同的功能,至少目前如此。分布式
如前所述,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中同样可视化图形的工具。
如前所述,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复制代码
这可能听起来有点奇怪,但因为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://stackabuse.com/how-to-use-tensorflow-with-java/
做 者:David Landup
译 者:klein
------
9月福利,关注公众号后台回复:004,领取8月翻译集锦!往期福利回复:001,002, 003便可领取!