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

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

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

以下为译文:

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

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


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



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

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


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


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


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


import numpy as np
revenue = np.dot(prices, amounts)
代码列表2. 用NumPy类库计算内积

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


关于TensorFlowPythonC ++ API的各种函数的详细文档,请参见https://www.tensorflow.org/api_docs/index.html


机器学习主要依赖于很多数学公式,本文将对使用TensorFlow进行这类数学运算做一个初步的介绍。通过示例和代码,大家可以对TensorFlow有一个初步了解。例如如何运用TensorFlow计算大数据的统计信息。 因此本文的重点将完全是关于如何使用TensorFlow,而不是一般的机器学习算法运用。


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

确保TensorFlow工作

首先,为我们的第一段代码创建一个名为test.py的新文件。 通过运行以下代码导入TensorFlow

import tensorflow as tf

在导入 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]] 注意,这是一个包含两个元素的向量,每个元素对应一个矩阵行。


eeeb458a8a0089d543f75d2b10bbfc4c5f845c76

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


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


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

 

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


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


192f94164f8b96575d058f4051193c7b2216458b

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是一个列表,第二个变量m2NumPy类库中的一个ndarray,最后一个变量m3TensorFlowTensor对象。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进行取反操作negnegation的缩写)。矩阵取反将正数转换为绝对值相同的负数,反之亦然。

取反操作是最简单的操作之一。 如代码列表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//www.tensorflow.org/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.org/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) )))

713c3ec7042deeb93d4dcff11c886c160e51fe71


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上的不同组件如何与机器学习管道的交互。 会话不仅执行图像操作,而且还可以使用占位符,变量和常量作为输入。 到目前为止,我们已经使用了常量,但在后面的部分,我们将开始使用变量和占位符。 以下是这三种类型值的简要概述。


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

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

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


932d751396aa0cb74b18a7b6a680ba9c5489f284

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


想了解更多?

 

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


数十款阿里云产品限时折扣中,赶紧点击领劵开始云上实践吧!

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

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


相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
相关文章
|
6小时前
|
机器学习/深度学习 TensorFlow 算法框架/工具
TensorFlow入门指南:基础概念与安装
【4月更文挑战第17天】TensorFlow入门指南介绍了该流行深度学习框架的基础概念和安装步骤。核心概念包括张量(多维数组)、计算图(表示计算任务的图结构)、会话(执行环境)以及变量(存储模型参数)。安装TensorFlow可通过pip或conda,GPU支持需额外条件。安装成功后,通过Python验证版本即可开始使用。
|
6小时前
|
机器学习/深度学习 算法 图计算
图机器学习入门:基本概念介绍
图机器学习是机器学习的分支,专注于处理图形结构数据,其中节点代表实体,边表示实体间关系。本文介绍了图的基本概念,如无向图与有向图,以及图的性质,如节点度、邻接矩阵。此外,还讨论了加权图、自循环、多重图、双部图、异构图、平面图和循环图。图在描述数据关系和特征方面具有灵活性,为机器学习算法提供了丰富的结构信息。
7 0
|
6小时前
|
机器学习/深度学习 人工智能 自然语言处理
使用TensorFlow进行深度学习入门
【5月更文挑战第11天】本文引导读者入门TensorFlow深度学习,介绍TensorFlow——Google的开源机器学习框架,用于处理各种机器学习问题。内容包括TensorFlow安装(使用pip)、核心概念(张量、计算图和会话)以及构建和训练简单线性回归模型的示例。通过这个例子,读者可掌握TensorFlow的基本操作,包括定义模型、损失函数、优化器以及运行会话。
|
6小时前
|
机器学习/深度学习
机器学习基础入门(二)(线性回归与成本函数)
已知一系列房子的大小以及其对应的价格的数据,要求是已知房子大小预测其房子的价格
|
6小时前
|
机器学习/深度学习 算法 算法框架/工具
Python深度学习基于Tensorflow(5)机器学习基础
Python深度学习基于Tensorflow(5)机器学习基础
14 2
|
6小时前
|
机器学习/深度学习 数据可视化 TensorFlow
【Python 机器学习专栏】使用 TensorFlow 构建深度学习模型
【4月更文挑战第30天】本文介绍了如何使用 TensorFlow 构建深度学习模型。TensorFlow 是谷歌的开源深度学习框架,具备强大计算能力和灵活编程接口。构建模型涉及数据准备、模型定义、选择损失函数和优化器、训练、评估及模型保存部署。文中以全连接神经网络为例,展示了从数据预处理到模型训练和评估的完整流程。此外,还提到了 TensorFlow 的自动微分、模型可视化和分布式训练等高级特性。通过本文,读者可掌握 TensorFlow 基本用法,为构建高效深度学习模型打下基础。
|
6小时前
|
机器学习/深度学习 自然语言处理 语音技术
【Python 机器学习专栏】Python 深度学习入门:神经网络基础
【4月更文挑战第30天】本文介绍了Python在深度学习中应用于神经网络的基础知识,包括神经网络概念、基本结构、训练过程,以及Python中的深度学习库TensorFlow和PyTorch。通过示例展示了如何使用Python实现神经网络,并提及优化技巧如正则化和Dropout。最后,概述了神经网络在图像识别、语音识别和自然语言处理等领域的应用,并强调掌握这些知识对深度学习的重要性。随着技术进步,神经网络的应用将持续扩展,期待更多创新。
|
6小时前
|
机器学习/深度学习 算法 数据挖掘
【Python 机器学习专栏】Python 机器学习入门:基础概念与流程
【4月更文挑战第30天】本文介绍了Python在机器学习中的重要性,机器学习的基础概念和分类,包括监督学习、非监督学习和强化学习。Python因其丰富的库(如Scikit-learn、TensorFlow、PyTorch)、简单易学的语法和跨平台性在机器学习领域广泛应用。文章还概述了机器学习的基本流程,包括数据收集、预处理、特征工程、模型训练与评估等,并列举了常用的Python机器学习算法,如线性回归、逻辑回归、决策树和支持向量机。最后,讨论了Python机器学习在金融、医疗、工业和商业等领域的应用,鼓励读者深入学习并实践这一技术。
|
6小时前
|
机器学习/深度学习 数据可视化 数据挖掘
《Python 简易速速上手小册》第9章:数据科学和机器学习入门(2024 最新版)
《Python 简易速速上手小册》第9章:数据科学和机器学习入门(2024 最新版)
25 1
|
6小时前
|
机器学习/深度学习 运维 监控
TensorFlow分布式训练:加速深度学习模型训练
【4月更文挑战第17天】TensorFlow分布式训练加速深度学习模型训练,通过数据并行和模型并行利用多机器资源,减少训练时间。优化策略包括配置计算资源、优化数据划分和减少通信开销。实际应用需关注调试监控、系统稳定性和容错性,以应对分布式训练挑战。