百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

深度学习TensorFlow入门实战

toyiye 2024-06-21 12:38 9 浏览 0 评论

本章介绍一个现阶段使用最广泛的深层学习框架——TensorFlow。因为TensorFlow所拥有的社区支持度日益增长,所以使用它来构建复杂的深度学习应用程序是我们的不二选择。从TensorFlow网站我们可以看到:

TensorFlow是一个使用数据流图进行数值计算的开源软件库。图中的节点代表数学运算,而图中的边则代表在这些节点之间传递的多维数组(张量)。借助这种灵活的架构,你可以通过一个API将计算工作部署到台式机、服务器或移动设备中的一个或多个CPU或GPU上。TensorFlow 最初是由Google Brain团队(隶属于Google机器智能研究部门)的研究人员和工程师开发的,旨在用于进行机器学习和深度神经网络研究。该系统具有很好的通用性,还可以应用于众多其他领域。


4.1 安装TensorFlow

TensorFlow有两种版本可以安装,分别是CPU版和GPU版。本书将使用GPU版。

4.1.1 在Ubuntu 16.04系统上安装GPU版的TensorFlow

在安装GPU版的TensorFlow之前,首先需要安装最新版的NVIDIA驱动程序,因为现阶段GPU版的TensorFlow只支持CUDA。接下来将会带领读者一步步地安装NVIDIA驱动程序和CUDA8驱动程序。

1.安装NVIDIA驱动程序和CUDA 8

首先需要安装正确的NVIDIA驱动程序。这里以GeForce GTX 960M GPU为例,因此会安装nvidia-375(如果读者使用的是其他版本,请通过NVIDIA官网来找到适合你的驱动程序)。如果你想确认你的GPU型号,可以在终端中使用如下命令。

lspci | grep –i nvidia

你将会看到以下输出。

接下来,需要添加一个专有的NVIDIA驱动程序库,以便能够使用apt-get安装驱动程序。

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update 
sudo apt-get install nvidia-375

在成功安装NVIDIA驱动程序之后,重启计算机,在终端输入以下命令来确认是否成功安装驱动程序。

cat /proc/driver/nvidia/version

终端的输出结果如下。

接下来,安装CUDA 8。打开NVIDIA官网的CUDA下载链接,根据图4.1所示的屏幕截图来选择你的操作系统、体系结构、发行版、版本号以及安装程序类型。

图4.1 CUDA 8安装过程屏幕截图

安装程序大约为2GB。需要使用如下安装命令。

sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb 
sudo apt-get update 
sudo apt-get install cuda

接下来,需要通过以下命令将这些库添加到.bashrc文件中。

echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

接下来,需要通过以下命令来验证CUDA 8是否成功安装。

nvcc –V

如果安装成功,将在终端中看到以下结果。

最后,安装cuDNN 6.0。NVIDIA CUDA深度神经网络库(NVIDIA CUDA Deep Neural Network library,cuDNN)是一个支持GPU加速的深层神经网络库。可以从NVIDIA官网下载它。使用以下命令来提取和安装cuDNN。

cd ~/Downloads/
tar xvfcudnn*.tgz
cd cuda
sudo cp */*.h /usr/local/cuda/include/
sudo cp */libcudnn* /usr/local/cuda/lib64/
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

为确保安装成功,可以在终端中使用nvidia-smi工具来进行验证。如果安装成功,该工具将提供GPU的监控信息,例如RAM和GPU的运行状态。

2.安装TensorFlow

在为TensorFlow准备好GPU环境之后,现在可以在GPU模式下安装TensorFlow了。在安装TensorFlow之前,可以先安装一些有用的Python软件包。这些包将在下一章中讲解,它们可以使开发环境使用起来更加简单。

通过以下命令开始安装一些有关数据操作、分析和可视化的库。

sudo apt-get update && apt-get install -y python-numpy python-scipy python-nose python-h5py python-skimage 
python-matplotlib python-pandas python-sklearn python-sympy
sudo apt-get clean && sudo apt-get autoremove
sudo rm -rf /var/lib/apt/lists/*

也可以安装更多有用的工具库,比如虚拟环境(virtual environment)、Jupyter、Notebook等。

sudo apt-get update 
sudo apt-get install git python-dev python3-dev python-numpy python3-numpy build-essential python-pip python3-pip python-virtualenv swig python-wheel libcurl3-dev 
sudo apt-get install -y libfreetype6-dev libpng12-dev 
pip3 install -U matplotlibipython[all] jupyter pandas scikit-image

最后,通过使用以下命令安装TensorFlow的GPU版。

pip3 install --upgrade tensorflow-gpu

接下来,使用Python来验证TensorFlow是否安装成功。

python3 
>>> import tensorflow as tf 
>>> a = tf.constant(5) 
>>> b = tf.constant(6) 
>>> sess = tf.Session() 
>>> sess.run(a+b) 
// this should print bunch of messages showing device status etc. // If everything goes well, you should see gpu listed in device 
>>> sess.close()

如果安装成功将会在终端中看到以下内容。

4.1.2 在Ubuntu 16.04系统上安装CPU版的TensorFlow

在本节中,你将会安装CPU版的TensorFlow,它的好处是在安装之前不需要安装额外的驱动程序。在安装开始之前建议你先安装一些有关数据操作和可视化的软件包。

sudo apt-get update && apt-get install -y python-numpy python-scipy python-nose python-h5py python-skimage 
python-matplotlib python-pandas python-sklearn python-sympy
sudo apt-get clean && sudo apt-get autoremove
sudo rm -rf /var/lib/apt/lists/*

也可以安装更多有用的工具库,比如虚拟环境(virtual environment)、Jupyter、Notebook等。

sudo apt-get update
sudo apt-get install git python-dev python3-dev python-numpy python3-numpy build-essential  python-pip python3-pip python-virtualenv swig python-wheel libcurl3-dev
sudo apt-get install -y libfreetype6-dev libpng12-dev
pip3 install -U matplotlibipython[all] jupyter pandas scikit-image

最后,安装最新的CPU版的TensorFlow。

pip3 install --upgrade tensorflow

接下来,为了验证是否安装成功,可以尝试以下命令。

python3 
>>> import tensorflow as tf 
>>> a = tf.constant(5) 
>>> b = tf.constant(6) 
>>> sess = tf.Session() 
>>> sess.run(a+b) 
>> sess.close()

如果安装成功,将会在终端中看到以下结果。

4.1.3 在Mac OS X上安装CPU版的TensorFlow

本节将介绍使用virtualenv为Mac OS X安装TensorFlow。首先,通过以下命令来安装pip工具。

sudo easy_install pip

接下来,安装虚拟环境库。

sudo pip install --upgrade virtualenv

安装完虚拟环境库之后,我们需要创建一个容器或虚拟环境来承载安装的TensorFlow,以及可能要安装的任何软件包,但不会影响底层主机系统。

virtualenv --system-site-packages targetDirectory # for Python 2.7
virtualenv --system-site-packages -p python3 targetDirectory # for Python 3.n

这里所指的targetDirectory是~/tensorflow。

现在虚拟环境已经创建好了,使用以下命令访问这个环境。

source ~/tensorflow/bin/activate

一旦你使用这个命令,就可以访问刚刚创建的虚拟环境了,并且可以安装任何只使用在这个环境中的软件包,而不会对底层或主机系统产生影响。

要退出虚拟环境,可以使用以下命令。

Deactivate

要进入虚拟环境,可以使用以下命令。一旦使用完TensorFlow,就应该关闭它。

source bin/activate

为了安装CPU版的TensorFlow,可以使用以下命令,该命令还将安装TensorFlow所需的任何相关库。

(tensorflow)$ pip install --upgrade tensorflow      # for Python 2.7
(tensorflow)$ pip3 install --upgrade tensorflow     # for Python 3.n

4.1.4 在Windows系统上安装CPU/GPU版的TensorFlow

假定你的系统上已经安装了Python 3。要安装TensorFlow,请按如下操作步骤以管理员身份启动命令提示符。具体做法为:打开“开始”菜单,搜索“cmd”,然后右击它,并选择“以管理员身份运行”,如图4.2所示。

图4.2 开始安装TensorFlow

一旦打开了一个命令窗口,即可以使用以下命令在GPU模式下安装TensorFlow。

C:\> pip3 install --upgrade tensorflow-gpu

在使用下一个命令之前,读者需要安装pip或pip3(根据Python版本)。

或者使用以下命令安装CPU版的TensorFlow。

C:\> pip3 install --upgrade tensorflow

4.2 TensorFlow运行环境

TensorFlow是谷歌的一个深度学习框架,顾名思义,它来源于神经网络在多维数据阵列或张量(Tensor)上执行的操作。TensorFlow实际上是张量流。

但首先我们要明确为什么要在本书中使用深度学习框架。

  • 它简化了机器学习代码。由于这些深度学习框架的存在,大部分深度学习和机器学习的研究都可以实现。它们允许数据科学家极其快速地迭代自己的深度学习项目,并为从业者提供了更多使用深度学习和其他机器学习算法的机会。谷歌、Facebook等大公司正在使用这种深度学习框架来扩展更多的用户。
  • 它可以计算梯度。深度学习框架也可以自动计算梯度。如果尝试过逐步进行梯度计算,我们会发现梯度计算并不简单,而且自己编写出无Bug的程序可能会非常困难。
  • 它将机器学习应用程序标准化以进行共享。另外,可以在不同的深度学习框架中使用的预训练模型可以在线获得。这些预训练模型可以帮助那些GPU资源有限的人,这样他们就不必每次都从头开始。我们可以站在巨人的肩膀上了解这些。
  • 不同的深度学习框架具有不同的优点。例如,范例、抽象层次、编程语言等。
  • 它会提供GPU并行处理的接口。使用GPU进行计算是一项非常吸引人的功能,因为由于庞大的内核数量和并行化,GPU加速代码的速度比CPU快得多。

这就是为什么想在深度学习方面取得突破,TensorFlow是读者的必然选择,因为它可以为读者的项目提供便利。

那么,简单地说,什么是TensorFlow?

  • TensorFlow是来自谷歌的深度学习框架,它是使用数据流图进行数值计算的开源软件。
  • TensorFlow最初是由谷歌Brain Team开发的,目的是促进他们的机器学习研究。
  • TensorFlow可以理解为机器学习算法的编程接口和执行这些算法的实现工具。

那么TensorFlow是怎么工作的?它的规则是什么?

4.3 计算图

关于TensorFlow的所有重要创新中最著名的是:把所有数字计算都表示为计算图,如图4.3所示。任何TensorFlow程序都将变成一个计算图,具体细节如下。

  • 图中的节点是有关任意输入和输出的运算节点。
  • 图中的节点之间的边可以理解为在运算之间流动的张量。简言之,在实践中张量就是n维数组。

使用图4.3所示的计算图作为深度学习框架的核心,其优势在于它允许我们根据小而简单的操作构建复杂的模型。另外,在后面的章节中会发现,这将使梯度计算变得非常简单。

图4.3 TensorFlow计算图

理解TensorFlow计算图概念的思路是,每个运算都是一个可以在图节点上进行计算的函数。

4.4 TensorFlow中的数据类型、变量、占位符

对计算图的理解将帮助我们根据小的子图和运算来思考复杂的模型。

看一个只有一个隐藏层的神经网络的例子,以及在TensorFlow中它的计算图的形状。

在这里求解经过ReLU激活后的结果,首先某个参数矩阵W乘以某个输入x再加上一个偏差项b,然后使用ReLU函数,取输出和零中的最大值。

在图4.3所示计算图中,有变量b、矩阵W和一个叫作x的占位符,图中同时包含每个运算的节点。下面进一步讲述这些节点类型。

4.4.1 变量

变量可以作为有状态的节点从而输出其当前值。在这个例子中,变量是b和W。变量是有状态的含义是在多次执行之后,程序依然保留了它们的当前值,并且很容易将已保存的值还原为变量,如图4.4所示。

图4.4 TensorFlow计算图

另外,变量还有其他有用的功能。例如,变量可以在训练期间或者训练后保存到硬盘中,这有助于实现前面提到的功能:可以让不同公司与团队的人员保存、存储模型参数并将它们发送给其他人。此外,变量可以调整变量以减少损失(loss),接下来我们将看到如何做到这一点。

注意,计算图中的变量(如b和W)仍然表示运算,因为根据定义,图中的所有节点都表示操作。因此,在运行过程中当求b和W的值时,我们将获得这些变量的值。

可以使用TensorFlow的Variable()函数来定义一个变量并给它赋初始值。

var = tf.Variable(tf.random_normal((0,1)),name='random_values')

这行代码将定义一个1×1的变量并使用标准正态分布初始化它[1],同时也可以给这个变量命名。

4.4.2 占位符

下一个类型的节点是占位符。占位符是指其值在执行时传入的节点,如图4.5所示。

图4.5 TensorFlow计算图

如果计算图中有依赖于某些外部数据的输入,那么可以使用占位符在训练期间添加值到计算图中。所以,对于占位符,我们不需要提供任何初始值,只需要给张量分配数据类型和形状。这样计算图就知道要计算什么,即使它尚未存储任何值。

可以使用TensorFlow的placeholder()函数来创建占位符。

ph_var1 = tf.placeholder(tf.float32,shape=(2,3))
ph_var2 = tf.placeholder(tf.float32,shape=(3,2))
result = tf.matmul(ph_var1,ph_var2)

这些代码行定义了两个特定形状的占位符变量,然后定义了将这两个值相乘的运算(具体介绍请参考4.4.3节)。

4.4.3 数学运算

第三类节点是数学运算,包括矩阵乘法(MatMul)、加法(Add)和ReLU,如图4.6所示。所有这些运算都是TensorFlow图中的节点,Tensorflow中的这些操作与NumPy操作非常相似。

图4.6 TensorFlow计算图

下面讨论计算图在代码中的形状。

执行以下步骤来生成图4.6。

1)创建并初始化权重W和b。初始化权重。矩阵W的方法是从均匀分布W?Uniform(?1,1)采样并且初始化b为0

2)创建输入占位符x,输入具有m * 784形状的矩阵。

3)建立一个流程图。

继续并按照以下步骤来构建流程图。

# import TensorFlow package 
import tensorflow as tf 
# build a TensorFlow variable b taking in initial zeros of size 100 
# ( a vector of 100 values) 
b  = tf.Variable(tf.zeros((100,)))
# TensorFlow variable uniformly distributed values between -1 and 1 
# of shape 784 by 100 
W = tf.Variable(tf.random_uniform((784, 100),-1,1))
# TensorFlow placeholder for our input data that doesn't take in 
# any initial values, it just takes a data type 32 bit floats as 
# well as its shape 
x = tf.placeholder(tf.float32, (100, 784))
# express h as TensorflowReLU of the TensorFlow matrix
#Multiplication of x and W and we add b 
h = tf.nn.relu(tf.matmul(x,W) + b )

从前面的代码可以看出,我们实际上并没有用这段代码来操纵任何数据。我们只是在图形内部构建符号,并且在运行此图表之前,无法输出h并查看其值。所以,这段代码只用于构建模型的核心。如果你尝试在前面的代码中输出W或b的值,则应该在Python中执行以下操作。

至此,我们已经定义了图形,现在需要实际运行它。

4.5 获取TensorFlow的输出

在4.4节中,读者知道了如何构建计算图,现在介绍如何实际运行它并获得它的输出。

我们可以用会话(session)来部署/运行计算图,会话可以将计算任务部署到一个特定的运算环境(如CPU或GPU)中。因此,可以使用会话将构建的计算图部署到CPU或GPU中。

为了运行计算图,需要定义一个名为sess的会话对象,并且调用带有两个参数的函数run。

sess.run(fetches, feeds)

其中,fetches指的是需要输出的所有计算图节点构成的列表,可以理解为我们希望计算的关键节点;feeds指的是从图中的节点到读者想要在模型中运行的实际值的字典映射,因此,feeds就是之前提到的要传入数值到占位符的地方。

详细代码如下所示。

# importing the numpy package for generating random variables for 
# our placeholder x 
import numpy as np 
# build a TensorFlow session object which takes a default execution 
# environment which will be most likely a CPU 
sess = tf.Session() 
# calling the run function of the sess object to initialize all the 
# variables. 
sess.run(tf.global_variables_initializer())
# calling the run function on the node that we are interested in, 
# the h, and we feed in our second argument which is a dictionary 
# for our placeholder x with the values that we are interested in. 
sess.run(h, {x: np.random.random((100,784))})

在通过sess对象运行计算图后,应该得到类似于以下的输出。

可以看到,在上面的代码片段的第9行[2]中,初始化变量,这是TensorFlow中的一个概念,它称为延后计算(lazy evaluation)。这意味着计算图只会在会话运行时计算。所以,调用函数global_variables_initializer()实际上会初始化计算图中所有的变量,比如之前例子中的W和b。

我们还可以在with代码块中使用会话变量,以确保在执行完该计算图后会话将关闭。

ph_var1 = tf.placeholder(tf.float32,shape=(2,3))
ph_var2 = tf.placeholder(tf.float32,shape=(3,2))
result = tf.matmul(ph_var1,ph_var2) 
with tf.Session() as sess: 
print(sess.run([result],feed_dict={ph_var1:[[1.,3.,4.],[1.,3.,4.]],ph_var2: [[1., 3.],[3.,1.],[.1,4.]]}))
Output: 
[array([[10.4, 22. ],       
       [10.4, 22. ]], dtype=float32)]

4.6 TensorBoard——可视化学习过程

当我们使用TensorFlow训练一个大规模的深度神经网络时,过程可能会很复杂且令人困惑,同时其相应的计算图也会很复杂。为了更容易地理解训练过程、调试和优化TensorFlow程序,TensorFlow团队开发了一套名为TensorBoard的可视化工具,它是一套可以通过浏览器运行的Web应用程序。TensorBoard可用于可视化TensorFlow计算图,绘制有关计算图运行结果的量化指标,并显示其他数据(如通过它的图像)。配置好的TensorBoard界面如图4.7所示。

图4.7 配置好的TensorBoard界面

本文截选自《深度学习案例精粹》

深度学习是机器学习中的一个流行子集,能够帮助用户更快速地构建复杂模型,并提供更准确的预测。《深度学习案例精粹》将带领读者进入深度学习的世界,通过实际操作示例来加深理解。

1.《深度学习案例精粹》语言简练,通过问题简述、方法概括及代码,让读者可以尽快理解并上手深度学习的算法。

2.《深度学习案例精粹》给出的代码非常详细,可以直接运行,可以为急于将深度学习应用于实际项目的工程师提供有力帮助,读者可至异步社区下载源代码及彩图文件。

3.《深度学习案例精粹》涵盖了大多数的主流深度学习任务,包括图像领域的图像识别、目标检测任务,自然语言处理中的词嵌入、情感分析任务,以及无监督学习任务等。还介绍了几个深度学习的经典模型,当下深度学习的大多数模型都是在这些基础模型上的改进与组合,不同领域的从业人员或多或少都能从中获得启发。

4.《深度学习案例精粹》使用目前广泛应用的深度学习框架之一—TensorFlow以及非常流行的Python语言进行代码示例,想要进一步学习的读者将会有极多的社区资源。


相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码