快捷搜索:  汽车  科技

深度学习及tensorflow简介(机器学习的敲门砖)

深度学习及tensorflow简介(机器学习的敲门砖)图1.图上半部分是计算机对矩阵的表示,下半部分是我们日常生活中对矩阵的表示。这种形式的符号是大多数科学计算类库中的常见范例。这段代码只是计算两个向量(也称为点积)的内积。想象一下,对于更复杂的问题,需要多少代码。例如求解线性方程或计算两个向量之间的距离。设想一下这个场景...你作为一名业务负责人,需要负责跟踪销售流程。你希望计算销售产品的收入。现在有100个不同的产品在你的仓库中,你需要用一个向量表示每个产品的价格。另一个大小为100的向量表示每个产品的库存量。以下的Python代码是用来计算销售所有产品的收入。注意了,这里没有调用任何类库。revenue = 0 for price amount in zip(prices amounts): revenue = price * amount代码列表1. 不使用任何Python类库计算两个向量的内积

本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。

以下为译文:

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

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

设想一下这个场景...你作为一名业务负责人,需要负责跟踪销售流程。你希望计算销售产品的收入。现在有100个不同的产品在你的仓库中,你需要用一个向量表示每个产品的价格。另一个大小为100的向量表示每个产品的库存量。以下的Python代码是用来计算销售所有产品的收入。注意了,这里没有调用任何类库。

revenue = 0 for price amount in zip(prices amounts): revenue = price * amount

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

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

图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中的机器学习算法是作用于张量上的,理解如何使用它们是关键。

深度学习及tensorflow简介(机器学习的敲门砖)(1)

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

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

import tensorflow as tf

# We’ll use NumPy matrices in TensorFlow

import numpy as np

# Define a 2x2 matrix in 3 different ways

m1 = [[1.0 2.0]

[3.0 4.0]]

m2 = np.array([[1.0 2.0]

[3.0 4.0]] dtype=np.float32)

m3 = tf.constant([[1.0 2.0]

[3.0 4.0]])

# Print the type for each matrix

print(type(m1))

print(type(m2))

print(type(m3))

# Create tensor objects out of the different types

t1 = tf.convert_to_tensor(m1 dtype=tf.float32)

t2 = tf.convert_to_tensor(m2 dtype=tf.float32)

t3 = tf.convert_to_tensor(m3 dtype=tf.float32)

# Notice that the types will be the same now

print(type(t1))

print(type(t2))

print(type(t3))

代码列表3.表示张量的不同方式

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

<class ‘tensorflow.python.framework.ops.Tensor’>

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

import tensorflow as tf # Define a 2x1 matrix matrix1 = tf.constant([[1. 2.]]) # Define a 1x2 matrix matrix2 = tf.constant([[1] [2]]) # Define a rank 3 tensor myTensor = tf.constant([ [[1 2] [3 4] [5 6]] [[7 8] [9 10] [11 12]] ]) # Try printing the tensors print(matrix1) print(matrix2) print(myTensor)

代码列表4。 创建张量

代码4的运行结果:

Tensor( “Const:0”

shape=TensorShape([Dimension(1)

Dimension(2)])

dtype=float32 )

Tensor( “Const_1:0”

shape=TensorShape([Dimension(2)

Dimension(1)])

dtype=int32 )

Tensor( “Const_2:0”

shape=TensorShape([Dimension(2)

Dimension(3)

Dimension(2)])

dtype=int32 )

从运行结果中可以看出,每个张量都由已命名的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的操作。

这里需要指出,定义操作(如取反操作)和运行它是不一样的。

import tensorflow as tf

# Define an arbitrary tensor

x = tf.constant([[1 2]])

# Negate the tensor

neg_x = tf.neg(x)

# Print the object

print(neg_x)

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

代码列表5的输出:

Tensor(“Neg:0” shape=(1 2) dtype=int32)

更多TensorFlow的运算符

官方文档详细地列出了所有可用的数学操作:

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

常用操作符的示例包括:

tf.add(x y)

Add two tensors of the same type x y

tf.sub(x y)

Subtract tensors of the same type x — y

tf.mul(x y)

Multiply two tensors element-wise

tf.pow(x y)

Take the element-wise power of x to y

tf.exp(x)

Equivalent to pow(e x) where e is Euler’s number (2.718…)

tf.sqrt(x)

Equivalent to pow(x 0.5)

tf.div(x y)

Take the element-wise division of x and y

tf.truediv(x y)

Same as tf.div except casts the arguments as a float

tf.floordiv(x y)

Same as truediv except rounds down the final answer into an integer

tf.mod(x y)

Takes the element-wise remainder from division

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

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

from math import pi

mean = 1.0

sigma = 0.0

(tf.exp(tf.neg(tf.pow(x — mean 2.0) /

(2.0 * tf.pow(sigma 2.0) ))) *

(1.0 / (sigma * tf.sqrt(2.0 * pi) )))

深度学习及tensorflow简介(机器学习的敲门砖)(2)

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

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

在会话中执行运算符

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

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

import tensorflow as tf

# Define an arbitrary matrix

matrix = tf.constant([[1. 2.]])

# Run the negation operator on it

neg_matrix = tf.neg(matrix)

# Start a session to be able to run operations

with tf.Session() as sess:

# Tell the session to evaluate negMatrix

result = sess.run(neg_matrix)

# Print the resulting matrix

print(result)

代码列表6.使用会话

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

会话配置

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

import tensorflow as tf

# Define a matrix and negate it

matrix = tf.constant([[1. 2.]])

negMatrix = tf.neg(matrix)

# Start the session with a special config passed into the constructor to enable logging

with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:

# Evaluate negMatrix

result = sess.run(negMatrix)

# Print the resulting value

print(result)

代码列表7 登录一个会话

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

Neg: /job:localhost/replica:0/task:0/cpu:0

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

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

•变量:可以更改的值,例如机器学习模型的参数。

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

深度学习及tensorflow简介(机器学习的敲门砖)(3)

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

想了解更多?

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

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

沟通和互动以及更多干货,欢迎关注新浪微博:@阿里云云栖社区

猜您喜欢: