机器学习的敲门砖:手把手教你TensorFlow初级入门

摘要:在开始使用机器学习算法以前,咱们应该首先熟悉如何使用它们。 而本文就是经过对TensorFlow的一些基本特色的介绍,让你了解它是机器学习类库中的一个不错的选择。
html

在开始使用机器学习算法以前,咱们应该首先熟悉如何使用它们。而本文就是经过对TensorFlow的一些基本特色的介绍,让你了解它是机器学习类库中的一个不错的选择。
linux

让咱们设想一下,当咱们用Python写代码时,没有那些方便的类库会是怎样一种窘境。这就比如你有一个新的智能手机,而不安装任何应用程序。虽然它仍然能够打电话,发短信,但若是有了那些更方便的应用程序,这部智能手机才更有价值。算法

设想一下这个场景...你做为一名业务负责人,须要负责跟踪销售流程。你但愿计算销售产品的收入。如今有100个不一样的产品在你的仓库中,你须要用一个向量表示每一个产品的价格。另外一个大小为100的向量表示每一个产品的库存量。如下的Python代码是用来计算销售全部产品的收入。注意了,这里没有调用任何类库。编程


代码列表1. 不使用任何Python类库计算两个向量的内积

这段代码只是计算两个向量(也称为点积)的内积。想象一下,对于更复杂的问题,须要多少代码。例如求解线性方程或计算两个向量之间的距离。
api

当你安装TensorFlow类库的同时,其中还包括了很是知名的NumPy类库,对Python编程中的数学操做很是有用。用Python编程时,不使用类库(例如NumPy和TensorFlow)就像使用没有自动对焦的相机:你虽然得到了更多的灵活性,但你可能很容易犯错。在机器学习的过程当中已经很容易犯错误了,因此就让咱们使用TensorFlow来提升化软件开发的效率吧。数组

代码列表2展现了如何使用NumPy简洁地编写相同的内积运算。session


代码列表2. 用NumPy类库计算内积

Python是一种简洁的语言,这意味着你不会看到冗长的代码。另外一方面,Python语言的简洁意味着许多处理都在后台进行,所以咱们应该熟悉它背后的原理。
框架

关于TensorFlowPythonC ++ API的各类函数的详细文档,请参见www.tensorflow.org/api_docs/in…机器学习

机器学习主要依赖于不少数学公式,本文将对使用TensorFlow进行这类数学运算作一个初步的介绍。经过示例和代码,你们能够对TensorFlow有一个初步了解。例如如何运用TensorFlow计算大数据的统计信息。所以本文的重点将彻底是关于如何使用TensorFlow,而不是通常的机器学习算法运用。编程语言

机器学习算法须要大量的数学运算。一般,某个算法能够归结为简单函数组合的迭代,直到它收敛为止。固然,也可使用任何标准编程语言来执行这些计算。可是使用像TensorFlow这样已经很是完善了的类库是提升代码可控性和性能的关键。

确保TensorFlow工做

首先,为咱们的第一段代码建立一个名为test.py的新文件。经过运行如下代码导入TensorFlow:


在导入TensorFlow后,若是Python解释器没有报错,那么咱们就能够开始使用TensorFlow了。

遇到了错误?在这里,常见错误的缘由是你可能安装了GPU版本,而且类库没法搜索CUDA驱动程序。请记住,若是使用CUDA编译库,则须要使用CUDA的路径更新环境变量。你须要检查TensorFlow上的CUDA指令。(有关详情,请参阅https://www.tensorflow.org/versions/master/get_started/os_setup.html#optional-linux-enable-gpu-support)。

使用TensorFlow中的规则

TensorFlow库一般使用tf限定名称来进行导入。通常来讲,使用tf限定名称是一个不错的方法,以便与其余开发人员和开源TensorFlow项目保持一致。你也能够选择不使用这个限定名称,但这会影响你在本身的项目中重用别人的TensorFlow代码。

表示张量

在现实世界中描述对象的一个简便方法就是经过罗列出它的属性或特征。 例如,咱们能够经过颜色,型号,发动机类型和里程数描述一辆汽车。 这些特征的有序列表被称为特征向量,这正是咱们要在TensorFlow代码中所表示的。

特征向量是机器学习中最有用的方法之一,(它们就是一个数字列表)。每一个数据项一般有一个特征向量,而一个好的数据集则具备数千个特征向量。毫无疑问,你会常常一次处理多个向量。矩阵简明地表示了向量列表,其中矩阵的每列表示一个特征向量。

在TensorFlow中用向量的向量表示矩阵,每一个向量具备相同的长度。图1是一个两行三列的矩阵的示例,例如[[1,2,3],[4,5,6]]。注意,这是一个包含两个元素的向量,每一个元素对应一个矩阵行。


图1.图上半部分是计算机对矩阵的表示,下半部分是咱们平常生活中对矩阵的表示。这种形式的符号是大多数科学计算类库中的常见范例。

咱们经过指定其行和列索引来定位矩阵中的元素。例如,第一行和第一列来表示左上角第一个元素。有时,咱们须要使用两个以上的索引,这样来表示一个元素会很方便。例如,在表示一个图片中的像素时,咱们不只经过其行和列值来描述它,并且还使用红,绿,蓝通道来对其进行描述。张量是经过任意数量的索引指定矩阵中元素的通常化。

一个张量的例子...假设一所小学为每一个学生分配座位。而你是这个学校的校长,而且你记不住这些学生的名字。幸运的是,每一个教室都有一个座位网格,能够经过学生的行和列来指定某个学生。

由于有多个教室,因此你不能简单的说“早上好,4排10列!”你还须要指定教室,好比说“你好,教室2的4排10列”。不像矩阵只须要两个索引就能指定一个元素,这所学校的学生须要三个数字。这三个数字都是三阶张量的一部分!

张量是更多的嵌套向量。例如,一个2×3×2的张量为[[[1,2],[3,4],[5,6]],[[7,8],[9,10] 11,12]]],它能够被认为是两个矩阵,每一个大小为3×2。所以,咱们说这个张量的秩是3.通常来讲,张量的秩是指定一个元素所需的索引的数量。TensorFlow中的机器学习算法是做用于张量上的,理解如何使用它们是关键。


图2.该张量能够被认为是堆叠在彼此之上的多个矩阵。要指定其中的某个元素,必须指明行和列,以及要访问的矩阵。所以,该张量的秩为三。

你可能会对如何表示张量产生疑惑。下面三行代码试图表示相同的2×2矩阵。该矩阵表示两个维度的两个特征向量。例如,它能够表示两我的对两部电影的评价。每一个人,由矩阵的行索引表示,分配一个数字来描述每一个人的电影评价值,由列索引表示。运行代码以了解如何在TensorFlow中生成矩阵。


第一个变量m1是一个列表,第二个变量m2是NumPy类库中的一个ndarray,最后一个变量m3是TensorFlow的Tensor对象。TensorFlow中全部运算符(如neg)都设计为对张量对象进行操做。tf.convert_to_tensor(...)这个方法,咱们能够用在任何地方,以确保咱们处理张量而不是其余类型。TensorFlow类库中的大多数方法都已经调用了它。使用tf.convert_to_tensor(...)并非必须的,在这里使用它,是由于它有助于咱们理解隐式类型的跨类库处理。


让咱们再来看看如何中定义张量。导入TensorFlow类库以后,咱们可使用常量运算符,如代码列表4所示。


代码列表4。 建立张量

代码4的运行结果:


从运行结果中能够看出,每一个张量都由已命名的Tensor对象表示。每一个Tensor对象都有一个惟一的标签(名称),一个用于定义其结构的维度(shape),以及用于指定咱们要操做的数据类型(dtype)。由于咱们并无显示指定名称,因此他们被自动命名为:“Const:0”,“Const_1:0”和“Const_2:0”。

张量类型

须要注意的是matrix1的每一个元素以小数点结束,这是为了告诉Python该元素的数据类型不是整数,而是浮点数。咱们能够传递显式dtype值。和NumPy数组同样,张量能够接受咱们指定的类型。

TensorFlow也提供了一些构造函数用于一些简单的张量。例如,tf.zeros(shape)建立了一个包涵全部值都被初始化为零的特定形态的张量。 相似地,tf.ones(shape)建立了一个全部元素值为1的张量。 shape参数是描述张量的维度的一维张量,它的类型是int32。

建立运算符

咱们已经有了几个初始的张量,如今咱们能够用运算符对他们进行操做,好比加减乘除。假设如今有一个矩阵,它的行表示货币交易,收款金额(正值)和收款金额(负值)。矩阵取反是表示某我的的货币流历史记录的一种方式。咱们如今对代码列表4中的matrix1进行取反操做neg(negation的缩写)。矩阵取反将正数转换为绝对值相同的负数,反之亦然。

取反操做是最简单的操做之一。如代码列表5所示,取反只需将一个张量做为输入,得出另外一个张量,每一个元素取反。如今,尝试本身运行代码。若是你已经掌握了如何使用取反,那就能够推广到全部其余TensorFlow的操做。

这里须要指出,定义操做(如取反操做)和运行它是不同的。


代码列表5.取反运算符的使用

代码列表5的输出:


更多TensorFlow的运算符

官方文档详细地列出了全部可用的数学操做:

https://www.tensorflow.org/api_docs/Python/math_ops.html。

经常使用操做符的示例包括:


咱们能够这些TensorFlow运算符来产生高斯分布(也称为正态分布)。 参见图3提示。 你能够参考wiki,找到正态分布的几率密度:https://en.wikipedia.org/wiki/Normal_distribution。

为了简洁起见,诸如“*”,“-”,“+”等大多数数学表达式是其TensorFlow运算符的快捷方式。高斯函数包括许多运算,以下所示:




3. 该图表示产生高斯分布所需的操做。 节点之间的连接表示数据如何从一个操做进入下一个操做。操做自己很简单,可是它们如何相互做用是相对复杂的。

TensorFlow算法很容易可视化。它们能够用流程图来进行描述。流程图就是一种图表。流程图中的每一个箭头都称为图形的边。而它的每一个状态被称为节点。

在会话中执行运算符

会话(session)是描述代码应该如何运行的软件系统环境。在TensorFlow中,会话设置了硬件设备(如CPU和GPU)如何相互通讯。这样,你只要关心如何设计机器学习算法,而没必要担忧底层硬件设备的运行。固然,你也能够配置会话以更改其底层硬件设备交互行为,而不更改上层代码。

要在TensorFlow中运行程序计算数值是须要一个会话的。只有在已建立的会话才能够对Tensor对象进行赋值。为此,咱们必须使用tf.Session()建立一个会话类,并由它来运行一个运算符(代码列表6)。


代码列表6.使用会话

恭喜!你刚刚写了第一个完整的TensorFlow代码。尽管它所作的是只是对一个矩阵进行取反,但它已经能充分体现TensorFlow中的核心概念与框架了。

会话配置

在建立tf.Session类时,咱们能够向构造函数传递一些参数。 例如,TensorFlow会根据可用的内容自动肯定为指定GPU或CPU设备的最佳方式。 在建立会话时,咱们能够设置log_device_placements = True,如代码列表7所示。


代码列表7登陆一个会话

这将输出有关每一个操做的会话中使用哪些CPU / GPU设备的信息。例如,执行代码列表6中的程序会有如下输出,它显示了用于运行取反操做的设备:


会话在TensorFlow中是必不可少的。咱们须要调用一个会话来执行数学操做。图4描述了TensorFlow上的不一样组件如何与机器学习管道的交互。会话不只执行图像操做,并且还可使用占位符,变量和常量做为输入。到目前为止,咱们已经使用了常量,但在后面的部分,咱们将开始使用变量和占位符。如下是这三种类型值的简要概述。

占位符:未分配的值,但将由运行的会话初始化。

变量:能够更改的值,例如机器学习模型的参数。

常数:不更改的值,例如超参数或设置。


图4.会话指示如何使用硬件来最有效地处理图形。当会话开始时,它将CPU和GPU设备分配给每一个节点。在处理以后,会话用可用格式(例如NumPy数组)输出数据。会话能够接受占位符,变量和常量。

想了解更多?

我但愿你经过本文已经熟悉了一些TensorFlow编程的基本方法。若是这篇文章让你对TensorFlow产生了兴趣,请下载Machine Learning with TensorFlow的第一章,从中了解更多内容。

文章原标题《Getting to Know TensorFlow》,做者:Nishant Shukla

文章为简译,更为详细的内容,请查看原文

本文由阿里云云栖社区组织翻译。

相关文章
相关标签/搜索