《TensorFlow自然语言处理》—2 理解TensorFlow
CHAPTER 2
第2章
理解TensorFlow
在本章中,你将深入了解TensorFlow。这是一个开源分布式数值计算框架,它将成为我们实现所有练习的主要平台。
我们通过定义一个简单的计算并用TensorFlow实现它来作为TensorFlow的入门。在成功完成此操作后,我们将探讨TensorFlow是如何执行这个计算的。这将有助于我们理解该框架如何创建计算图来计算输出/并通过称为“会话”的方式执行此图。然后,通过将TensorFlow执行操作的方式与餐厅的运作进行类比,我们深入理解TensorFlow架构。
在对TensorFlow的运行方式有了良好的概念性和技术上的理解之后,我们将介绍该框架提供的一些重要的计算操作。首先,我们将讨论如何在TensorFlow中定义各种数据结构,比如变量、占位符和张量,同时我们还将介绍如何读取输入。然后,我们将执行一些与神经网络相关的操作(例如,卷积运算、定义损失函数和优化方法)。接下来,我们将学习如何使用作用域来重用和有效管理TensorFlow变量。最后,在练习中应用这些知识,实现一个可以识别手写数字图像的神经网络。
2.1 TensorFlow是什么
在第1章中,我们简要讨论了TensorFlow是什么。现在让我们更深入地认识它。Tensor-
Flow是由Google发布的开源分布式数值计算框架,主要用于减少在实现神经网络的过程中那些令人感到痛苦的细节(例如,计算神经网络权重的梯度)。TensorFlow使用计算统一设备架构(CUDA)来进一步有效实现这种数值计算,CUDA是由NVIDIA引入的并行计算平台。在https://www.tensorf?low.org/api_docs/python/上有TensorFlow的应用程序编程接口(API),可以看到TensorFlow提供了数千种操作,这使我们的工作更轻松。
TensorFlow不是一夜之间开发出来的,它是有才华、善良的人们坚持不懈的成果。他们希望通过将深度学习带给更广泛的用户来使我们的生活发生变化。如果你有兴趣,可以访问https://github.com/tensorf?low/tensorf?low查看TensorFlow代码。目前,TensorFlow拥有大约1000名贡献者,并且拥有超过25?000次成果提交,它每天都在变得越来越好。
2.1.1 TensorFlow入门
现在让我们通过代码示例了解TensorFlow框架中的一些基本组件,让我们编写一个示例来执行以下计算,这对于神经网络非常常见:
这里W和x是矩阵,b是向量。然后,*表示点积。sigmoid是一个非线性变换,由以下公式给出:
我们将逐步骤讨论如何通过TensorFlow进行此计算。
首先,我们需要导入TensorFlow和NumPy。在Python中运行与TensorFlow或NumPy相关的任何类型的操作之前,必须先导入它们:
接下来,我们将定义一个图对象,稍后我们将在这个对象上定义操作和变量:
图形对象包括计算图,计算图可以连接我们在程序中定义的各种输入和输出,以获得最终的所需输出(即它定义了如何根据图连接W,x和b来生成h)。例如,如果你将输出视为蛋糕,那么图就是使用各种成分(即输入)制作蛋糕的配方。此外,我们将定义一个会话对象,该对象将定义的图作为输入,以执行图。我们将在下一节详细讨论这些元素。
你可以用以下方式创建新的图对象,就像我们在上一个的例子里一样:
或者你可以用以下方式获取TensorFlow的默认计算图:
这两种方式都会在练习中使用。
现在我们定义一些张量,即x、W、b和h。张量在TensorFlow中基本上是n维数组。例如,一维向量或二维矩阵称为张量。在TensorFlow中有几种不同的方法可以定义张量,在这里,我们会讨论三种不同的方法:
1.首先,x是占位符。顾名思义,占位符没有初始化值,我们将在图执行时临时提供值。
2.接下来,我们有变量W和b。变量是可变的,这意味着它们的值可以随时间变化。
3.最后,我们有h,这是一个通过对x、W和b执行一些操作而产生的不可变张量:
另外,请注意,对于W和b,我们提供了一些重要的参数,如下所示:
它们称为变量初始化器,是最初赋值给W和b变量的张量。变量不能像占位符一样在没有初始值的情况下传递,并且我们需要一直为变量指定一些值。这里,tf.random_uniform意味着我们在minval(-0.1)和maxval(0.1)之间均匀地采样,以便将采样值赋给张量,而tf.zeros则用零初始化张量。在定义张量时,定义张量的形状也非常重要,shape属性定义张量的每个维度的大小。例如,如果形状是[10, 5],则意味着它将是一个二维结构,在第0维上有10个元素,在1维上有5个元素。
接下来,我们将运行初始化操作,初始化图中的变量W和b:
现在,我们执行该图,以获得我们需要的最终输出h。这是通过运行session.run(…)来完成的,我们提供占位符的值作为session.run()命令的参数:
最后,我们关闭会话,释放会话对象占用的资源:
下面是这个TensorFlow例子的完整代码。本章所有的示例代码都可以在ch2文件夹下的tensorf?low_introduction.ipynb中找到。
当你执行这段代码的时候,可能会遇到下面这样的警告:
不用担心这个,这个警告说你使用了现成的TensorFlow预编译版本,而没有在你的计算机上编译它,这完全没问题。如果你在计算机上进行编译,会获得稍微好一点的性能,因为TensorFlow将针对特定硬件进行优化。
在后面的几节中,我们将解释TensorFlow如何执行此代码,以生成最终输出。另请注意,接下来的两节可能有些复杂和偏技术。但是,即使你没有完全理解所有内容,也不必担心,因为在此之后,我们将通过一个完全是现实世界中的例子来进一步说明。我们会用在我们自己的餐厅Café Le TensorFlow里订单是如何完成的,来解释之前的相同执行过程。
- 点赞
- 收藏
- 关注作者
评论(0)