译者序
前言
序
实践练习
1.TensorFlow基础
2.TensorFlow中实现线性回归
3.TensorFlow中实现聚类
4.TensorFlow中单层神经网络
5.TensorFlow中多层神经网络
6.并发
结束
致谢
关于作者,BSC,UPC,GEMLeB
参考
关于本书
译者序
本人对一直对高性能网络服务器,分布式存储比较感兴趣,在BAT时也一直从事架构开发,并没有做过机器学习相关工作,平时喜欢阅读分析开源代码,到目前为止已分析完约8套开源代码; 这次趁着Google开源TensorFlow,想往深度学习方向尝试一下,先学习分析下TensorFlow的使用与源码,在查阅资料时,发现本书对工程师背景的人非常有帮助,完全考虑了工程师的思维方式,因为原书作者也是工程师背景,但原书有西班牙语与英文版,不方便扩散阅读,为了使有更多工程师背景的同学看到此书,故努力翻译成中文版,因本人英文水平有限,翻译有错的地方,欢迎批评指正~~~
后面会在微信公众号中推送后续的翻译章节,与TensorFlow的第一次接触系列已整理成pdf,关注公众号后回复:tensorflow即可下载~~公众号:源码之心
前言
受益于计算,海量数据存储,互联网技术等关键技术的快速发展,机器学习领域同样得到了巨大发展。自动学习直接或间接地影响了很多人日常生活中的各种活动与方面。比如在我们手机上进行语音识别,图像分类或检测垃圾邮件,这在十几年以前听上去只能出现在科幻中。在股票交易模型或药物模型中使用机器学习已经巨大影响了我们的社会。另外,在不久的将来,无人驾驶,无人机与各种类型的机器人都将深远的影响我们的社会。
作为机器学习一个子类的深度学习,自2006年重现后,已经毫无疑问成为一个爆炸式增长的领域。其实,在硅谷的很多创业公司都在从事这个方向,像Google,Facebook,微软,IBM这样的大公司也拥有开发与研究小组。深度学习甚至已经在大学与研究领域外引起了广泛兴趣,很多专业杂志(如Wired),甚至一般杂志(如New York Times, Bloomberg or BBC)都开始发表该领域的相关文章。
这一趋势已经吸引很多学生,创业者和投资者加入深度学习。由于吸引了很多人的兴趣,一些工具库也已经以开源的形式开放出来,作为Caffe库的主要推广者,该库由我们2012年在Berkeley读博士期间开发,我可以说这本书中介绍的由Google设计研发的TensorFlow,我从2013年就开始研究,将会成为研究者与SME公司用来研发深度学习与机器学习的主要工具之一。大量工程师与顶级科学家加入该项目会成为其强有力的保证,最终会推动开源。
我希望这本入门书能帮助有兴趣加入这个领域的读者,衷心感谢本书原作者在努力传播本技术,也很荣幸能认识他。原作者在TensorFlow开源2个月后及时地写了本书(第一版为西班牙语)。充满生命力的巴塞罗那及它想在参与这场技术变革,该技术必将深远影响我们的各种生活领域。
序
本书的目的是给想扩展机器学习知识的工程师们传播该思想。我相信任何一个有工程背景的人,都将会发现深度学习的应用与一般的机器学习都会对他们的工作非常有价值。
基于我的背景,读者可能好奇我为何要挑战写关于这项新的深度学习技术。我研究的重点逐渐从超级计算架构与大数据负载运行时可执行中间件过渡到基于海量数据的机器学习平台。
准确的来说,作为一个工程师,而不是数据科学家,我认为我可以通过这本书做出贡献,而且它会对很多初学的工程师非常有帮助,接下来他们会自己选择如何进一步学习。
希望这本书可以为我所热爱的教育事业添加一些价值。我认为知识是自由的,并且可以被所有人接触。基于这个原因,这本书的内容会完全免费地放在网上(原书名:first contact with tensorflow),如果读者觉的本书内容有用,并认可作者的付出,有一个按钮可进行捐赠,另外,如果读者想获得纸质版本,可在Amazon上购买。
西班牙版本的本书依然可用。其实,本书翻译自西班牙语版本,该书完成于去年1月并在GEMLeB会议上发表。
感谢阅读本书!这是对我写作本书的肯定。认识我的人都知道,我热衷于传播技术,它驱使我保持学习。
实践练习
深度学习的一个通用应用是模式识别。就像你在刚开始学编程的时候从“Hello word”开始,在深度学习中,从识别手写数字建模开始。接下来分析的第一个神经网络模型,就会涉及到叫作TensorFlow的新机器学习技术。
当然,我不想写一本关于机器学习或深度学习的学术书籍,我只希望TensorFlow这个新的机器学习库能尽快的进入大众视野。我也会向我的数据科学家同事们说声抱歉,因为我会向普通读者传播该领域的知识。
读者会发现一些在我课程里经常使用的组织结构,这是想让你在学习的时候多动手。我们将这叫做“从实践中学习”,从在UPC作教授的多年经验来看,这个方法对工程师学习一个新领域十分有用。
因为这个原因,本书从实践出发,而且我已经尽量减少理论部分。不过在学习算法过程中有必要的地方,还是保留了一些数学理论推导。
假设读者已经对机器学习有了一定的理解,我会使用一些流行的算法逐步指导读者作用TensorFlow进行训练。
第一章中,首先介绍下TensorFlow将会扮演重要角色的机器学习场景,再借机会介绍TensorFlow程序的基本结构及简明阐述其在内部保持的数据结构。
第二章中,通过一个线性回归的例子,我会阐述一些基本代码,同时说明在学习过程中如何调用各种重要组件,比如cost function或梯度下降优化算法。
第三章中,详细介绍了聚类算法,会详细分析TensorFlow的基本数据结构—tensor,TensorFlow库提供了不同的创建与管理tensor的类与函数。
第四章中,详细分析如何构建单层神经网络来识别手写数字。通过这个例子,我们可以梳理前几章阐述的各种观念以及创建模型与测试模型的整个过程。
第五章中基于前一章中介绍的神经网络概念,介绍如何构建一个多层神经网络来获得更精确的识别手写数字。在这会详细介绍众所周知的卷积神经网络。
第六章中,我们会分析一个具体的例子—利用GPU强大的计算能力,也许并不是所有的读者都会感兴趣。正如在第一章中介绍的,GPU在训练神经网络过程中发挥了重要作用。
本书的结束语中总结了一些结论。再次说明,本书中的代码都可以通过Github上获得。
一.TensorFlow基础
本章中,简要说明TensorFlow代码与编程模型。通过阅读本章,希望读者有能力在自己的电脑上安装TensorFlow库。
开源库
机器学习已经在学术圈研究了几十年,但只是在最近几年公司才参与其中。这得益于已经拥有的大规模数据以及空前的计算能力变的可用。在这种情况下,Alphabet旗下的Google毫无疑问成为了在产品中使用机器学习的最大公司之一。
去年十月,在Google的季度会议上,可以看到其在销售额与利润上的显著增长,CEO SundarPichai明确表明,机器学习是我们重新思考我们所做所有事的核心与创新方式。
准确的来说,我们处在一个变革的纪元,Google并是唯一一个大角色。其它科技公司如微软,Facebook,Amazon,Apple及其它很多大公司都已经在该领域投入大量研发。
几个月前,Google基于Apache2.0协议开源了TensorFlow,开发者与研究者可以在他们的工程与产品中通过该库使用机器学习算法。与此同时,Google内部也在不同的商业产品如Gmail,Google Photos,搜索,语音识别中使用TensorFlow。
TensorFlow最初由Google大脑小组研发,其目的是集中于机器学习与神经网络研究,但该系统同样也适用于更广泛的机器学习问题。
因为我是一个工程师,同时本书也面向工程师,本书会详细分析机器学习算法是如何用数据流图描述的。TensorFlow可以被看作一个使用数据流图进行数值计算的库。图中的节点代表数学操作,图中连结各顶点的边代表多维数组,也叫tensors。
TensorFlow包含了构建数据流图与计算数据流图的基本步骤,数据流图代表了稍后需要数值计算的符号操作。这使得TensorFlow可以充分利用各平台上的CPU与GPU,包括Linux 64位所有平台如Mac OSX及移动平台如Android与iOS。
TensorFlow的另外一个优势是它拥有一个虚拟的TensorBoard模块,该模块可以监控与显示算法如何运行。可以测量与显示算法的运行情况对于创建一个更好的模型十分有帮助。我有一种推测现在很多模型都在通过有点盲目的方式来调优,如不停尝试与试错,这明显浪费了很多资源,尤其是时间。
TensorFlow Serving
最近Google发布了TensorFlowServing,帮助开发者把他们TensorFlow训练的模型(甚至可以扩展到其它类型的模型)部署到生产环境中。TensorFlow Serving是一个基于Apache 2.0协议的C++开源系统,目前可通过github获得。
TensorFlow与TensorFlow Serving的区别是什么呢?通过TensorFlow,开发者可以很容易的建立机器学习算法并通过一定格式的数据输入进行训练模型。TensorFlow Serving专注于使得这些模型在生产环境中使用。设计目的是开发者通过TensroFlow训练模型,使用TensorFlow Serving的API响应客户端的外部请求。这使得开发者可以基于随着时间变化的真实数据对不同模型进行实验,原地得到一个稳定的架构与API。
经典的pipeline过程是训练数据输入到学习器中,输出一个模型,此模型经过验证后可以部署到TensorFlow serving系统。随着新数据的产生或改进模型,经常要迭代我们的模型。实际上,在google发表的相关论方中也提到,它们内部会有很多pipelines同时运行,新数据到来后会产生新版本的模型。
开发者在前端通过grpc与TensorFlow Serving进行通信,grpc是一个高性能,google开源的RPC框架。
如果读者对TensorFlow Serving感兴趣,建议你阅读Serving architecture overview小节,接下来安装你的环境,开始基础练习。
TensorFlow安装
从现在开始,建议读者开始在你的电脑上进行动手练习,TensorFlow有Python API(也有C/C++版本),它需要提前安装Python2.7。
一般而言,当你使用Python时,你应该安装虚拟环境virtualenv。Virtualenv是一个可以使一台机算机上不同部分的Python依赖保持独立。如果我们使用virtualenv安装TensorFlow时,不会覆盖其它工程中TensorFlow中需要的Python库版本。
首先,需要提前先安装pip与virtualenv,如下面的命令所示,
# Ubuntu/Linux64-bit
$ sudo apt-getinstall python-pip python-dev python-virtualenv
# Mac OS X
$ sudoeasy_install pip
$ sudo pipinstall --upgrade virtualenv
environment
virtualenv的目录:~/tensorflow:
$ virtualenv --system-site-packages~/tensorflow
接下来是激活virtualenv,命令如下:
$ source~/tensorflow/bin/activate #with bash
$ source~/tensorflow/bin/activate.csh #with csh
(tensorflow)$
从现在开始,我们使用的虚拟环境的名字会出现在每一个命令行的开头,一旦激活了virtualenv,可以在虚拟环境里直接通过pip安装TensorFlow,
# Ubuntu/Linux64-bit, CPU only:
(tensorflow)$sudo pip install --upgradehttps://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl
# Mac OS X, CPUonly:
(tensorflow)$sudo easy_install --upgrade six
(tensorflow)$sudo pip install --upgradehttps://storage.googleapis.com/tensorflow/mac/tensorflow-0.7.1-cp27-none-any.whl
建议读者访问官方文档主页,安装最新稳定版本的TensorFlow。
如果你的平台上有GPU,安装的版本会稍有不同。同样建议读者访问官方文档,查看你的GPU是否满足支持TensorFlow。如果需要TensorFlow支持GPU,需要安装额外的开发包,所有需要的信息都能在TensorFlow的下载与安装页面了解到。如想了解更多使用GPU的信息,建议阅读第六章。
最后,使用完毕后,应该使用如下命令停止虚拟环境:
(tensorflow)$deactivate
由于本书的写作目的所限制,建议读者访问之前提到的官方文档主页,了解其它安装TensorFlow的方式。
TensorFlow中的第一段代码
正如开篇所说的,我们将通过少量理论与大量练习来学习TensorFlow。
从现在开始,读者可以使用任何文档编辑器来写Python代码并保存为以.py结尾的文件。通过类似如下命令来运行代码:python test.py
为了先对TensorFlow的代码风格有第一认识,建议先写一个简单的乘法代码示例,详细如下:
import tensorflow as tf
a =tf.placeholder("float")
b =tf.placeholder("float")
y = tf.mul(a,b)
sess = tf.Session()
printsess.run(y, feed_dict={a: 3, b: 3})
此代码中,在导入Python模块tensorFlow后,我们定义两个符号变量placeholder,随后在代码执行的时候可以操作这两个变量。然后,我们将这两个变量作为参数传给我们调用的乘法函数,tf.mul是众多数学运算中的一个,TensorFlow提供这些函数来操作tensors。在这里,tensors可以看作是动态大小,多维的元素数组。
主要的数学运算操作如下表所示:
Operation Description
tf.add sum
tf.sub substraction
tf.mul multiplication
tf.div division
tf.mod module
tf.abs return the absolute value
tf.neg return negative value
tf.sign return the sign
tf.inv returns the inverse
tf.square calculates the square
tf.round returns the nearest integer
tf.sqrt calculates the square root
tf.pow calculates the power
tf.exp calculates the exponential
tf.log calculates the logarithm
tf.maximum returns the maximum
tf.minimum returns the minimum
tf.cos calculates the cosine
tf.sin calculates the sine
TensorFlow也为程序员提供了一系统操作矩阵的函数,其中一些如下所述:
Operation Description
tf.diag returns a diagonal tensor with a given diagonal values
tf.transpose returns the transposes of the argument
tf.matmul returns a tensor product of multiplying two tensors listed as arguments
tf.matrix_determinant returns the determinant of the square matrix specified as an argument
tf.matrix_inverse returns the inverse of the square matrix specified as an argument
接下来最重要的一步就是创建一个session,用来计算生成的符号表达式。实际上,到现在为止TensorFlow代码并没有被执行。需要再次强调,TensorFlow既是一个表示机器学习算法的接口,又是运行机器学习算法的实现,该示例就是一个很好的例子。
通过Session()接口创建一个session后,只有调用run()方法后才开始真正的被执行。在这个代码示例中,变量的值通过feed_dict参数传给run()。相关代码解析表达式并显示乘法结果为9再退出。
通过这个示例,我想阐明的是,正常使用TensorFlow编程的步骤为:首先定义实现整个问题,其次,创建一个session来运行相关计算。
也许有时候我们希望更加灵活地构建代码,如在图中插入一个操作或只运行图的子图,当我们在使用Python的交互式环境IPython时就会发生这种情况。为了解决这个问题,TensorFlow提供了tf.InteractiveSession()类。
这种编程模型的设计初衷超过了本书的讨论范围。为继续阅读下一章,读者只需要知道所有信息都保存在图结构的内部,这些信息包含了所有运算操作与数据。
图用来描述数学计算。图中的结点实现了具体数学运算操作,同时它们也代表了数据流入,结果输出,读写持久化变量的点。图中的边代表了结点间的相互关系及结点的输入与输出,同时,边也包含了tensors,也就是TensorFlow中的基本数据结构。
图中隐含的信息使得TensorFlow可以推断出事务之间的依赖及异步的调度运算操作到各设备。当这些运算操作所依赖的输入都已经就绪后,就可以并发运行这些运算。并发可以使得我们缩短对一些计算密集型算法的运算时间,同时TensorFlow中也提供一些复杂运算的高效实现对缩短计算时间也会有帮助。另外,大部分的这些操作都有相关的kernels,kernels是对具体设备的操作实现,如GPU设备。下表总结了一些重要的操作/kernels:
Operations groups Operations
Maths Add, Sub, Mul, Div, Exp, Log, Greater, Less, Equal
Array Concat, Slice, Split, Constant, Rank, Shape, Shuffle
Matrix MatMul, MatrixInverse, MatrixDeterminant
Neuronal Network SoftMax, Sigmoid, ReLU, Convolution2D, MaxPool
Checkpointing Save, Restore
Queues and syncronizations Enqueue, Dequeue, MutexAcquire, MutexRelease
Flow control Merge, Switch, Enter, Leave, NextIteration
显示Tensorboard面板
为了使得算法更加容易理解,TensorFlow中的可视化工具包含了一些debug函数与优化程序,该可视化工具叫Tensorboard。Tensorboard中可察看不同类型的统计与图中任一部分的计算细节。
Tensorboard模块中显示的数据来源于TensorFlow的执行过程,计算过程中的状态信息被抽取保存到trace files中。在TensorFlow的官方文档中,可以看到更加详细的该Python API的实现细节。
启动Tensorboard服务十分简单,直接在命令行中执行相关命令,并传递文件名为参数,命令如下:
(tensorflow)$ tensorboard --logdir= trace file;
你可以在浏览器中访问本地6006端口来查看Tensorboad信息,如http://localhost:6006/
对Tensorboard的研究同样超出了本书的讨论范围。关于Tensorboard如何实现的详细细节,读者可查阅Tensorflow文档中的Tensorboard图形可视化小节。