TensorFlow学习笔记——《TensorFlow技术解析与实战》

在这里插入图片描述

著名历史学家斯塔夫里阿诺斯在《全球通史》中,曾以15世纪的航海在“物理上”连通“各大洲”作为标志将人类历史划分为两个阶段。在我正在写作的《互联网通史》中,我把互联网这个“信息上”连通“人类个体”的物件作为划分人类历史的标志。而随着人工智能最近的崛起,我们又该思考重新划分了,因为人工智能将会在“信息上”连通“各个物体”。到那时各个物体都有“智能”,如智能汽车、智能电视、扫地机器人、智能音响等智能家居,想象极度的智能下,屋子里的电器和家居都可能和我们有简单的交互。

深度学习领域之所以异军突起,是因为传统的研发思维,如架构、组件化、大规模并发、存储与计算等,已经是技术红海了,而每位工程师都应该学习机器学习,是因为它带给工程师全新的开发思维,工程师可以用自己的代码让机器更加“聪明”。

TensorFlow 是谷歌公司开发的深度学习框架,也是目前深度学习的主流框架之一。本书从深度学习的基础讲起,深入TensorFlow框架原理、模型构建、源代码分析和网络实现等各个方面。全书分为基础篇、实战篇和提高篇三部分。基础篇讲解人工智能的入门知识,深度学习的方法,TensorFlow的基础原理、系统架构、设计理念、编程模型、常用API、批标准化、模型的存储与加载、队列与线程,实现一个自定义操作,并进行TensorFlow源代码解析,介绍卷积神经网络(CNN)和循环神经网络(RNN)的演化发展及其TensorFlow实现、TensorFlow的高级框架等知识;实战篇讲解如何用TensorFlow写一个神经网络程序并介绍TensorFlow实现各种网络(CNN、RNN和自编码网络等),并对MINIST数据集进行训练,讲解TensorFlow在人脸识别、自然语言处理、图像和语音的结合、生成式对抗网络等方面的应用;提高篇讲解TensorFlow的分布式原理、架构、模式、API,还会介绍TensorFlow XLA、TensorFlow Debugger、TensorFlow和Kubernetes结合、TensorFlowOnSpark、TensorFlow移动端应用,以及TensorFlow Serving、TensorFlow Fold和TensorFlow计算加速等其他特性。最后,附录中列出一些可供参考的公开数据集,并结合作者的项目经验介绍项目管理的一些建议。

本书深入浅出,理论联系实际,实战案例新颖,基于最新的TensorFlow 1.1版本,涵盖TensorFlow的新特性,非常适合对深度学习和TensorFlow感兴趣的读者阅读。

————————————————————————

基础篇

现在许多电脑开机密码、支付宝的刷脸支付、客流的闸机通行都有采用人脸识别技术。目前市面上也有许多人脸识别考勤机。

更进一步讲,人脸识别中还可以识别出人物的年龄、性别、是否佩戴眼镜、是否有笑容、情绪欢乐或悲伤,以及眼睛、鼻子、嘴等关键部位,这就是人脸关键点检测。

国内有一些公司在人脸识别上已经达到了先进水平,如云从科技、旷视科技、商汤科技等。旷视科技的Face++有目前世界一流的人脸追踪、识别、分析等服务应用,面向开发者的云平台及API、SDK,已经可以直接调用。

国际上的谷歌、苹果、亚马逊、微软等巨大公司都在“两条腿走路”,一方面在做研发项目,如“谷歌大脑”(Google Brain),另一方面同时发力智能家居,如“Google Home智能音箱”,希望把设备当成人来交流。国内的阿里、腾讯、百度、搜狗、地平线等公司以及很多不同领域的创业公司也都在积累的大量数据上,开始尝试训练出高效的模型,不断优化业务指数。

深度学习的前身是人工神经网络(artificial neural network,ANN),它的基本特点就是试图模仿人脑的神经元之间传递和处理信息的模式。

扫描二维码关注公众号,回复: 4216191 查看本文章

人工神经网络由各个层组成,输入层 (input layer)输入训练数据,在输出层 (output layer)输出计算结果,中间有1个或多个隐藏层 (hidden layer),使输入数据向前传播到输出层。

“深度”一词没有具体的特指,一般就是要求隐藏层很多(一般指5层、10层、几百层甚至几千层)。

经典机器学习理论与基本算法包括支持向量机、逻辑回归、决策树、朴素贝叶斯分类器、随机森林、聚类算法、协同过滤、关联性分析、人工神经网络和BP算法、PCA、过拟合与正则化等。

很多做模式识别的工作者之所以厉害,是因为他们有过很多、很深的论文积累,对模型的设计有很独到的见解,而他们可能甚至一行代码也不会写,而工程(写代码)能力在工作中很容易训练。许多工程方向的软件工程师,工作模式常常在实现业务逻辑和设计架构系统上,编码能力很强,但却缺少论文积累。同时具有这两种能力的人,正是硅谷一些企业目前青睐的人才。

深度学习的革命性在于,它不需要我们过多地提取特征,在神经网络的每一层中,计算机都可以自动学习出特征。

框架的主要目的就是提供一个工具箱,使开发时能够简化代码,呈现出来的模型尽可能简洁易懂。

·

TensorFlow的一大亮点是支持异构设备分布式计算(heterogeneous distributed computing)。

这里的异构设备,是指使用CPU、GPU等核心进行有效地协同合作;与只依靠CPU相比,性能更高,功耗更低。

分布式架构目的在于帮助我们调度和分配计算资源(甚至容错,如某个计算节点宕机或者太慢),使得上千万、上亿数据量的模型能够有效地利用机器资源进行训练。

TensorFlow支持卷积神经网络 (convolutional neural network,CNN)和循环神经网络(recurrent neural network,RNN),以及RNN的一个特例长短期记忆网络 (long short-termmemory,LSTM),这些都是目前在计算机视觉、语音识别、自然语言处理方面最流行的深度神经网络模型。

TensorFlow的优点:
灵活性(可以自写算法)、可移植和多语言支持(随时随地,tensor一下)、优化性能(对计算机资源的合理分配)、快速产出(可以快速试验.尝试各种新算法)、自动求微分等。

国内几家比较有特色的做人工智能的公司:
陌上花科技(dress+)、旷视科技(Face++)、科大讯飞(语音识别解决方案)、地平线(嵌入式人工智能)等

·

librosa是用Python进行音频特征提取的第三方库,有很多方式可以提取音频特征。

nltk模块中包含着大量的语料库,可以很方便地完成很多自然语言处理的任务,包括分词、词性标注、命名实体识别(NER)及句法分析。

Keras是第一个被添加到TensorFlow核心中的高级框架,成为Tensorflow的默认API。

TFLearn是另一个支持TensorFlow的第三方框架。

有了神经网络,我们的系统自己就能学习到哪些特征是有效的、哪些是无效的,通过自己学习的这些特征,就可以做到自己分类,这就大大提高了我们解决语音、图像这种复杂抽象问题的能力。

TensorFlow被认为是一个“符号主义”的库,它将图的定义和图的运行完全分开。

TensorFlow中涉及的运算都要放在图中,而图的运行只发生在会话session中。

TensorFlow的运行原理:输入(input)、塑形(reshape)、Relu层(前向传播)、Logit层(输出层)、Softmax(输出概率分布)、交叉熵(cross entropy)、梯度(gradient)、SGD训练(反向传播更新)、评估预测。

变量 (variable)是一种特殊的数据,它在图中有固定的位置,不像普通张量那样可以流动。

·

深度神经网络随着网络深度加深,训练起来会越来越困难,收敛速度会很慢,常常会导致梯度弥散问题。

批标准化BN(batch normalization)就是为了克服神经网络层数加深导致难以训练而诞生的,用它来规范化某些层或者所有层的输入,从而固定每层输入信号的均值与方差,让每一层的输入有一个稳定的分布会有利于网络的训练。

批标准化BN的优点:加大探索的步长,加快收敛的速度;更容易跳出局部最小值;破坏原来的数据分布,一定程度上缓解过拟合。

因此,在遇到神经网络收敛速度很慢或梯度爆炸等无法训练的情况下,都可以尝试用批标准化来解决。

tf.nn.dropout() # 防止过拟合,用来舍弃某些神经元

TensorFlow中常见的分类函数主要有sigmoid_cross_entropy_with_logits、softmax、log_softmax、softmax_cross_entropy_with_logits等。

TensorFlow提供了很多优化器(optimizer),比如
tf.train.GradientDescentOptimizer BGD、SGD
tf.train.MomentumOptimizer 动量梯度下降
tf.train.AdamOptimizer (momentum+RMSprop)
tf.train.RMSPropOptimizer 衰减算法,在RNN效果很好

FIFOQueue可以创建一个先入先出队列。
例如,我们在训练一些语音、文字样本时,使用循环神经网络的网络结构,希望读入的训练样本是有序的,就要用FIFOQueue。

RandomShuffleQueue可以创建一个随机队列。
例如,我们在训练一些图像样本时,使用CNN的网络结构,希望可以无序地读入训练样本,就要用RandomShuffleQueue,每次随机产生一个训练样本。

训练网络和读取数据是异步的,主线程在训练网络,另一个线程在将数据从硬盘读入内存。

量化是数字信号处理领域的一个概念,是指将信号的连续取值(或者大量可能的离散取值)近似为有限多个(或较少的)离散值的过程。

规范化,也称为标准化,是将数据按比例缩放,使之落入一个小的特定区间。
在神经网络中是指将数据减去平均值,再除以标准差。

梯度消失是指在更新模型参数时采用链式求导法则反向求导,越往前梯度越小。最终的结果是到达一定深度后梯度对模型的更新就没有任何贡献了。

CNN历史:LeNet–AlexNet–VggNet、GoogleNet–ResNet

RNN历史:Vanilla–GRU–LSTM–BRNN

CNN的权值共享的结构显著降低了模型的复杂度,减少了权值的数量。
池化层又稀疏参数来减少要学习的参数,降低网络的复杂度。

LeNet:conv3,pool2,fc1,softmax10

AlexNet:conv5,pool5,fc3,softmax1000
5000万个参数(dropout和大数据解决了这个问题)
AlexNet的成功之处在于它用了dropout、relu、大数据集ImageNet、GPU实现

VggNet:conv5,pool5,fc3
它和AlexNet的不同在于它使用的卷积层更多,可以到达准确率的瓶颈

GoogleNet对传统的卷积方法做了两点改进:将原来的线性卷积层变为多层感知卷积层,将全连接层的改进为全局平均池化
并且深度深一点,为避免梯度消失问题还加了两个损失函数
增加了多种大小的卷积核,起到了降低特征映射厚度的作用

ResNet:DNN越深,网络退化越严重,为此ResNet中引入了一个shortcut结构,远程跳接,将输入跳层传递与卷积的结果相加。

·

循环神经网络主要是自然语言处理NLP(natural language processing)应用的一种网络模型。它不同于传统的前馈神经网络FNN(feed-forward neural network),循环神经网络在网络中引入了定性循环,使信号从一个神经元传递到另一个神经元并不会马上消失,而是继续存活。

循环神经网络的训练是使用误差反向传播BP(backpropagation)算法,但它在反向传播中,不仅依赖当前层的网络,还依赖前面若干层的网络,这种算法称为随时间反向传播BPTT(backpropagation through time)算法。
BPTT算法是BP算法的扩展,可以将加载在网络上的时序信号按层展开,这样就使得前馈神经网络的静态网络转化为动态网络。

一般的RNN只能与前面若干序列有关,若超过十步,就很容易产生梯度消失或者梯度爆炸问题。
通过引入单元(cell)结构,得到了RNN的改进模型长短期记忆LSTM(Long-Short Term Memory)模型,这个模型可以解决梯度消失的问题
它有三个门:更新门、遗忘门(选择性遗忘)、输出门

GRU和LSTM十分相似
GRU有两个门,重置门和更新门
重置门决定如何组合新输入和之前的记忆,更新门决定留下多少之前的记忆
如果把重置门都设为1,更新门都设为0,就得到一个普通的RNN

双向RNN(Bidirectional RNN)当前的输出不仅与前面的序列有关,而且与后面的序列有关。

·

词嵌入(word embedding)在机器学习中非常常见,可以应用在自然语言处理、推荐系统等其他程序中。

word2vec模型(产生词向量),它依赖与两个模型:词袋模型(Bag of words)CBOW和skip-gram模型
CBOW模型是用词的前后几个词来预测这个词,而Skip-gram模型则是用一个词来预测他周围的词

AlphaGo用到的一个技术是强化学习
强化学习介于监督学习和无监督学习之间,通过惩罚机制不断学习
强化学习主要用在游戏、下棋、博弈这类有得分并且有很多步操作的活动中,主要是用来做连续决策

在绘画、音乐等领域,有一个非常著名的算法是神经风格迁移,这个算法主要是进行绘画、音乐风格的迁移产生新的作品

TFLearn是一个建立在TensorFlow顶部的模块化的深度学习框架
它在构建网络时,直接使用网络中相关层的方法即可,非常方便(把当前对象传递给下一层的参数,最后赋值给model,然后fit)

Keras是一个高级的Python神经网络框架
它在构建网络时,先定义一个Sequential模型,然后往model里add每个层的相关方法,完了编译模型compile.指明cost和optimizer,最后训练fix、评估evaluate

——————————————————————————

实战篇

x = tf.placeholder(tf.float32, [None, 1])
定义占位符,在训练时(sess.run)再喂入数据(feed_dict)

op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
定义优化器,训练时就训练这个

学习率(learning rate)是一个最常设定的超参数。学习率设置得越大,训练时间越短,速度越快;而学习率设置得越小,训练得准确度越高。

mini-batch大小是另一个最常设定的超参数,每批大小决定了权重的更新规则。

正则项系数λ(regularization parameter)是另一个常用的超参数,如果在较复杂的网络发现出现了明显的过拟合(在训练数据准确率很高但测试数据准确率反而下降),可以考虑增加此项。

MNIST(Mixed National Institute of Standards and Technology)是一个入门级的计算机视觉数据集,都是手写字符。

自编码器autoencoder是神经网络的一种,是一种无监督学习方法,数据无标记。
这里面主要有两个过程:压缩和解压。
压缩依靠的是输入数据(图像、文字、声音)本身存在不同程度的冗余信息,自动编码网络通过学习去掉这些冗余信息,把有用的特征输入到隐藏层中。
这里和主成分分析PCA有些类似,要找到可以代表源数据的主要成分。
如果激活函数不使用sigmoid等非线性函数,而使用线性函数,就是PCA模型。

压缩过程一方面要限制隐藏神经元的数量,来学习一些有意义的特征,另一方面还希望神经元大部分时间是被抑制的,当神经元的输出接近1时认为是被激活的,接近0时认为是被抑制的。
希望部分神经元处于被抑制状态,这种规则称为稀疏性限制

·

人脸检测属于目标检测的一部分,它对要检测的目标对象进行概率统计,然后用得到的模型来匹配输入的图像。
人脸图像匹配与识别就是把提取的人脸图像的特征数据与数据库中存储的人脸特征模板进行搜索匹配,根据相似程度对身份信息进行判断,设定一个阈值,当相似度超过这一阈值,则把匹配得到的结果输出,大多用在安防领域。

系统获取的人脸图像可能受到各种条件的限制和随机干扰,需要进行缩放、旋转、拉伸、光线补偿、灰度变换、直方图均衡化、规范化、几何校正、过滤以及锐化等图像预处理。

人脸关键点定位技术主要有级联形回归CSR(cascaded shape regression),目前人脸识别一般是基于DeepID网络结构(conv4.pool3.deepID1)

由于卷积神经网络层数越高视野域越大,这种连接方式可以既考虑局部的特征,又考虑全局的特征

·

RNN模型分为:一对一(图像分类.)、一对多(通过音符生成音乐.图片描述)、多对一(情感分析.电影评价)、多对多(机器翻译MT.视频分类)

生成式对抗网络GAN(generative adversarial network)是由谷歌公司在2014年提出的一个网络模型,主要灵感来自于二人博弈中的零和博弈,也是目前最火热的非监督深度学习的代表

它包含一个生成模型G(generative model)和一个判别模型D(discriminative model),互相对抗,道高一尺魔高一丈,达到均衡后停止

生成式对抗网络取得的成果有很多,目前在生成数字和生成人脸图像方面表现都非常好,目前也是深度学习研究的一个重要思路

——————————————————————————

猜你喜欢

转载自blog.csdn.net/weixin_42394432/article/details/82918015
今日推荐