使用Go语言来理解Tensorflow

您所在的位置:网站首页 natuzzi价格一般多少 使用Go语言来理解Tensorflow

使用Go语言来理解Tensorflow

2024-07-05 05:38:56| 来源: 网络整理| 查看: 265

0 分享至

用微信扫码二维码

分享至好友和朋友圈

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中的说明编译并安装了Tensorflow绑定。 理解Tensorflow结构 让我们来重复一下什么是Tensorflow:

引用

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

我们可以把Tensorflow视为一种描述性语言,这有点像SQL,你可以在其中描述你想要的内容,并让底层引擎(数据库)解析你的查询、检查句法和语义错误、将其转换为内部表示形式、进行优化并计算出结果:所有这一切都会给你正确的结果。 因此,当我们使用任何一个API时,我们真正做的是描述一个图:当我们把图放到Session中并显式地在Session中运行图时,图的计算就开始了。 知道了这一点之后,让我们试着来定义一个计算图并在一个Session中进行计算吧。API文档为我们提供了tensorflow(简写为 tf)和op包中所有方法的列表。 我们可以看到,这两个包包含了我们需要定义和计算图形的所有内容。 前者包含了构建一个基本的“空”结构(就像Graph本身)的功能,后者是包含由C++实现自动生成绑定的最重要的包。 然而,假设我们要计算A与x的矩阵乘法,其中

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

代码

package main import ( "fmt" tf "github.com/tensorflow/tensorflow/tensorflow/go" "github.com/tensorflow/tensorflow/tensorflow/go/op" ) func main() { // 这里,我们打算要: 创建图 // 我们要定义两个占位符用于在运行的时候传入 // 第一个占位符 A 将是一个 [2, 2] 的整数张量 // 第二个占位符 x 将是一个 [2, 1] 的整数张量 // 然后,我们要计算 Y = Ax // 创建图的第一个节点: 一个空的节点,位于图的根 root := op.NewScope() // 定义两个占位符 A := op.Placeholder(root, tf.Int64, op.PlaceholderShape(tf.MakeShape(2, 2))) x := op.Placeholder(root, tf.Int64, op.PlaceholderShape(tf.MakeShape(2, 1))) // 定义接收A和x作为输入参数的操作节点 product := op.MatMul(root, A, x) // 每次我们把一个`Scope`穿给操作符的时候,把操作放在作用域的下面。 // 这样,我们有了一个空的作用域(由NewScope创建):空的作用域是图的根,因此可以用“/”来表示。 // 现在,我们让tensorflow按照我们的定义来创建图。 // 把作用域和OP结合起来,创建具体的图。 graph, err := root.Finalize() if err != nil { // 这里没办法处理这个错误: // 如果我们错误的定义了图,我们必须手工修改这个定义。 // 这就跟SQL查询一样:如果查询语句在语法上有问题,我们只能重新写 panic(err.Error()) } // 如果在这里,图在语法上是正确的。 // 我们就可以把它放到一个Session里,并执行。 var sess *tf.Session sess, err = tf.NewSession(graph, &tf.SessionOptions{}) if err != nil { panic(err.Error()) } // 要使用占位符,我们必须创建一个Tensors,这个Tensors包含要反馈到网络的数值 var matrix, column *tf.Tensor // A = [ [1, 2], [-1, -2] ] if matrix, err = tf.NewTensor([2][2]int64{ {1, 2}, {-1, -2} }); err != nil { panic(err.Error()) } // x = [ [10], [100] ] if column, err = tf.NewTensor([2][1]int64{ {10}, {100} }); err != nil { panic(err.Error()) } var results []*tf.Tensor if results, err = sess.Run(map[tf.Output]*tf.Tensor{ A: matrix, x: column, }, []tf.Output{product}, nil); err != nil { panic(err.Error()) } for _, result := range results { fmt.Println(result.Value().([][]int64)) } }

代码注释的很详细,希望读者能阅读每一行注释。 现在,Tensorflow-Python用户期望该代码进行编译并正常工作。我们来看看它是否正确:

代码

go run attempt1.go

这是他看到的结果:

代码

panic: failed to add operation "Placeholder": Duplicate node name in graph: 'Placeholder'

等等,这里发生了什么? 显然,存在两个名称都为“Placeholder”的操作。 第一节课: 节点ID 每当我们调用一个方法来定义一个操作时,Python API都会生成不同的节点,无论是否已经被调用过。下面的代码返回3。

代码

import tensorflow as tf a = tf.placeholder(tf.int32, shape=()) b = tf.placeholder(tf.int32, shape=()) add = tf.add(a,b) sess = tf.InteractiveSession() print(sess.run(add, feed_dict={a: 1,b: 2}))

我们可以通过打印占位符的名称来验证此程序是否创建了两个不同的节点:print(a.name,b.name)生成Placeholder:0 Placeholder_1:0,因此,b占位符是Placeholder_1:0,而a占位符是Placeholder:0。 在Go中,相反,之前的程序会执行失败,因为A和x都命名为Placeholder。我们可以得出这样的结论: Go API不会在每次调用函数来定义操作的时候自动生成新的名字:操作的名字是固定的,我们无法修改。 提问时间:

关于Tensorflow架构,我们学到了哪些东西?图中的每个节点都必须具有唯一的名称。每个节点都用名称来标识。节点的名称与用名字来定义的操作相同吗?是的,但还有更好的答案,不完全是,节点的名称只是操作的一部分。

为了详细说明第二个答案,我们来解决节点名重复的问题。 第二节课: 作用域 正如我们刚刚看到的那样,每定义一个操作时,Python API都会自动创建一个新的名称。在底层,Python API调用类Scope的C++方法WithOpName。以下是方法的文档及其签名,保存在scope.h中: /// Return a new scope. All ops created within the returned scope will have /// names of the form /[_ /阅读下一篇/ 返回网易首页 下载网易新闻客户端



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭