您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>源码下载>C/C++语言编程>

以Go绑定实例理解TensorFlow

大小:0.3 MB 人气: 2017-09-28 需要积分:1

  本文通过一个简单的Go绑定实例,让读者一步一步地学习到Tensorflow有关ID、作用域、类型等方面的知识。以下是译文。

  Tensorflow并不是机器学习方面专用的库,而是一个使用图来表示计算的通用计算库。它的核心是用C++实现的,并且还有不同语言的绑定。Go语言绑定是一个非常有用的工具,它与Python绑定不同,用户不仅可以通过Go语言使用Tensorflow,还可以了解Tensorflow的底层实现。

  绑定

  Tensorflow的开发者正式发布了:

  C++源代码:真正的Tensorflow核心,实现了具体的高级和低级操作。

  Python绑定和Python库:这个绑定是由C++实现自动生成的,这样我们可以使用Python来调用C++函数。此外,这个库将调用融合到了绑定中,以便定义更高级别的API

  Java绑定。

  Go绑定。

  作为一个Go开发者而不是一个Java爱好者,我开始关注Go绑定,以便了解他们创建了什么样的任务。

  Go绑定

  

  地鼠与Tensorflow的徽标

  首先要注意的是,Go API缺少对Variable的支持:该API旨在使用已经训练过的模型,而不是从头开始训练模型。安装Tensorflow for Go的时候已经明确说明了:

  TensorFlow提供了可用于Go程序的API。这些API特别适合于加载用Python创建并需要在Go程序中执行的模型。

  如果我们对培训ML模型不感兴趣,万岁!相反,如果你对培训模型感兴趣,那就有一个建议:

  作为一个真正的Go开发者,保持简单!使用Python定义并训练模型;你可以随时使用Go来加载并使用训练过的模型!

  简而言之,go绑定可用于导入和定义常量图;在这种情况下,常量指的是没有经过训练的过程,因此没有可训练的变量。

  现在,开始用Go来深入学习Tensorflow吧:让我们来创建第一个应用程序。

  在下文中,我假设读者已经准备好Go环境,并按照README(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/go/README.md)中的说明编译并安装了Tensorflow绑定。

  理解Tensorflow结构

  让我们来重复一下什么是Tensorflow:

  TensorFlow™是一款使用数据流图进行数值计算的开源软件库。图中的节点表示数学运算,而图的边表示在节点之间传递的多维数据数组(张量)。

  我们可以把Tensorflow视为一种描述性语言,这有点像SQL,你可以在其中描述你想要的内容,并让底层引擎(数据库)解析你的查询、检查句法和语义错误、将其转换为内部表示形式、进行优化并计算出结果:所有这一切都会给你正确的结果。

  因此,当我们使用任何一个API时,我们真正做的是描述一个图:当我们把图放到Session中并显式地在Session中运行图时,图的计算就开始了。

  知道了这一点之后,让我们试着来定义一个计算图并在一个Session中进行计算吧。API文档(https://godoc.org/github.com/tensorflow/tensorflow/tensorflow/go)为我们提供了(简写为)和包中所有方法的列表。

  我们可以看到,这两个包包含了我们需要定义和计算图形的所有内容。

  前者包含了构建一个基本的“空”结构(就像Graph本身)的功能,后者是包含由C++实现自动生成绑定的最重要的包。

  然而,假设我们要计算A与x的矩阵乘法,其中

  以Go绑定实例理解TensorFlow

  我假设读者已经熟悉了tensorflow图定义的基本思想,并且知道占位符是什么以及它们如何工作。下面的代码是对Tensorflow Python绑定的第一次尝试。我们来调用这个文件attempt1.go

  以Go绑定实例理解TensorFlow

  代码注释的很详细,希望读者能阅读每一行注释。

  现在,Tensorflow-Python用户期望该代码进行编译并正常工作。我们来看看它是否正确:

  这是他看到的结果:

  等等,这里发生了什么? 显然,存在两个名称都为“Placeholder”的操作。

  第一节课:节点ID

  每当我们调用一个方法来定义一个操作时,Python API都会生成不同的节点,无论是否已经被调用过。下面的代码返回3。

  以Go绑定实例理解TensorFlow

  我们可以通过打印占位符的名称来验证此程序是否创建了两个不同的节点:print(a.name,b.name)生成Placeholder:0 Placeholder_1:0,因此,b占位符是Placeholder_1:0,而a占位符是Placeholder:0。

  在Go中,相反,之前的程序会执行失败,因为A和x都命名为Placeholder。我们可以得出这样的结论:

  Go API不会在每次调用函数来定义操作的时候自动生成新的名字:操作的名字是固定的,我们无法修改。

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!