推荐下我自己建的人工智能Python学习群:[809160367],群里都是学Python的,如果你想学或者正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货,还有免费直播课程领取。包括我自己整理的一份2021最新的Python进阶资料和零基础教学,欢迎进阶中和对Python感兴趣的小伙伴加入!还可以扫码加VX领取资料哦!
下面是正文
本章介绍一个现阶段使用最广泛的深层学习框架——TensorFlow。因为TensorFlow所拥有的社区支持度日益增长,所以使用它来构建复杂的深度学习应用程序是我们的不二选择。从TensorFlow网站我们可以看到:
TensorFlow是一个使用数据流图进行数值计算的开源软件库。图中的节点代表数学运算,而图中的边则代表在这些节点之间传递的多维数组(张量)。借助这种灵活的架构,你可以通过一个API将计算工作部署到台式机、服务器或移动设备中的一个或多个CPU或GPU上。TensorFlow 最初是由Google Brain团队(隶属于Google机器智能研究部门)的研究人员和工程师开发的,旨在用于进行机器学习和深度神经网络研究。该系统具有很好的通用性,还可以应用于众多其他领域。
TensorFlow有两种版本可以安装,分别是CPU版和GPU版。本书将使用GPU版。
在安装GPU版的TensorFlow之前,首先需要安装最新版的NVIDIA驱动程序,因为现阶段GPU版的TensorFlow只支持CUDA。接下来将会带领读者一步步地安装NVIDIA驱动程序和CUDA8驱动程序。
首先需要安装正确的NVIDIA驱动程序。这里以GeForce GTX 960M GPU为例,因此会安装nvidia-375(如果读者使用的是其他版本,请通过NVIDIA官网来找到适合你的驱动程序)。如果你想确认你的GPU型号,可以在终端中使用如下命令。
lspci | grep –i nvidia
你将会看到以下输出。
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所示的屏幕截图来选择你的操作系统、体系结构、发行版、版本号以及安装程序类型。
安装程序大约为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的运行状态。
在为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()
如果安装成功将会在终端中看到以下内容。
在本节中,你将会安装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
假定你的系统上已经安装了Python 3。要安装TensorFlow,请按如下操作步骤以管理员身份启动命令提示符。具体做法为:打开“开始”菜单,搜索“cmd”,然后右击它,并选择“以管理员身份运行”,如图4.2所示。
一旦打开了一个命令窗口,即可以使用以下命令在GPU模式下安装TensorFlow。
C:\> pip3 install --upgrade tensorflow-gpu
在使用下一个命令之前,读者需要安装pip或pip3(根据Python版本)。
或者使用以下命令安装CPU版的TensorFlow。
C:\> pip3 install --upgrade tensorflow
TensorFlow是谷歌的一个深度学习框架,顾名思义,它来源于神经网络在多维数据阵列或张量(Tensor)上执行的操作。TensorFlow实际上是张量流。
但首先我们要明确为什么要在本书中使用深度学习框架。
这就是为什么想在深度学习方面取得突破,TensorFlow是读者的必然选择,因为它可以为读者的项目提供便利。
那么,简单地说,什么是TensorFlow?
那么TensorFlow是怎么工作的?它的规则是什么?
关于TensorFlow的所有重要创新中最著名的是:把所有数字计算都表示为计算图,如图4.3所示。任何TensorFlow程序都将变成一个计算图,具体细节如下。
使用图4.3所示的计算图作为深度学习框架的核心,其优势在于它允许我们根据小而简单的操作构建复杂的模型。另外,在后面的章节中会发现,这将使梯度计算变得非常简单。
理解TensorFlow计算图概念的思路是,每个运算都是一个可以在图节点上进行计算的函数。
对计算图的理解将帮助我们根据小的子图和运算来思考复杂的模型。
看一个只有一个隐藏层的神经网络的例子,以及在TensorFlow中它的计算图的形状。
在这里求解经过ReLU激活后的结果,首先某个参数矩阵W乘以某个输入x再加上一个偏差项b,然后使用ReLU函数,取输出和零中的最大值。
在图4.3所示计算图中,有变量b、矩阵W和一个叫作x的占位符,图中同时包含每个运算的节点。下面进一步讲述这些节点类型。
变量可以作为有状态的节点从而输出其当前值。在这个例子中,变量是b和W。变量是有状态的含义是在多次执行之后,程序依然保留了它们的当前值,并且很容易将已保存的值还原为变量,如图4.4所示。
另外,变量还有其他有用的功能。例如,变量可以在训练期间或者训练后保存到硬盘中,这有助于实现前面提到的功能:可以让不同公司与团队的人员保存、存储模型参数并将它们发送给其他人。此外,变量可以调整变量以减少损失(loss),接下来我们将看到如何做到这一点。
注意,计算图中的变量(如b和W)仍然表示运算,因为根据定义,图中的所有节点都表示操作。因此,在运行过程中当求b和W的值时,我们将获得这些变量的值。
可以使用TensorFlow的Variable()函数来定义一个变量并给它赋初始值。
var = tf.Variable(tf.random_normal((0,1)),name='random_values')
这行代码将定义一个1×1的变量并使用标准正态分布初始化它[1],同时也可以给这个变量命名。
下一个类型的节点是占位符。占位符是指其值在执行时传入的节点,如图4.5所示。
如果计算图中有依赖于某些外部数据的输入,那么可以使用占位符在训练期间添加值到计算图中。所以,对于占位符,我们不需要提供任何初始值,只需要给张量分配数据类型和形状。这样计算图就知道要计算什么,即使它尚未存储任何值。
可以使用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节)。
第三类节点是数学运算,包括矩阵乘法(MatMul)、加法(Add)和ReLU,如图4.6所示。所有这些运算都是TensorFlow图中的节点,Tensorflow中的这些操作与NumPy操作非常相似。
下面讨论计算图在代码中的形状。
执行以下步骤来生成图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.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)]
当我们使用TensorFlow训练一个大规模的深度神经网络时,过程可能会很复杂且令人困惑,同时其相应的计算图也会很复杂。为了更容易地理解训练过程、调试和优化TensorFlow程序,TensorFlow团队开发了一套名为TensorBoard的可视化工具,它是一套可以通过浏览器运行的Web应用程序。TensorBoard可用于可视化TensorFlow计算图,绘制有关计算图运行结果的量化指标,并显示其他数据(如通过它的图像)。配置好的TensorBoard界面如图4.7所示。