TensorFlow(一)
本博文参考TensorFlow技术解析与实践(李嘉璇),仅用于学习
一、TensorFlow简介
在以统计学习为核心的机器学习方法成为主流后,我们需要的领域知识就少了,重要的是做特征工程,然后调一些参数,根据一些领域的经验来不断提取特征。深度学习的革命性在于,它不需要我们过多地提取特征,在神经网络的每一层中,计算机都可以自动学习出特征。为了实现深度学习中运用的神经网络,tensorflow这样的深度学习开源工具就应运而生 。我们可以使用它来搭建自己的神经网络。框架的主要目的是提供一个工具箱,使开发时能够简化代码,呈现出来的模型尽可能简洁易懂。
TensorFlow的一大亮点在于支持异构设备分布式计算。异构设备是指CPU、GPU的协同合作。分布式是指分配和资源调度。Tensor库是对 CPU/GPU 透明的、有一个完全独立的代码库、没有编译过程。产品的应用领域一般有两个:云平台和移动嵌入。
特性:1、高度的灵活性。TensorFlow是一个采用数据流图(data flow graph),用于数值计算的开源软件库。只要计算可以表示为一个数据流图,就可以使用TensorFlow,只需要构建图,书写计算的内部循环即可。因此,它并不是一个严格的“神经网络库”。2、真正的可移植性。3、将科研和产品结合在一起。4、自动求微分。5、多语言支持。TensorFlow提供了 Python、C++、 Java接口来构建用户的程序,而核心部分是用C++实现的。 6、最优化性能。
二、安装方法
与其他软件相比(caffe),tensorflow比较容易安装,环境部署十分轻松。直接从GitHub代码仓库中将tensorflow源代码下载下来,解压保存本地。pip是一个安装、管理Python软件包的工具,通过pip可以安装已经打包好的tensorflow以及tensorflow所需要的依赖关系。打开cmd,选用基于pip的安装方法,直接pip install 相应的包就可以完成安装。
依赖的模块:
numpy:用来存储和处理大型矩阵的科学计算包。
matplotlib:绘图库。有一套与MATLAB相似的命令API,适合交互式制图。
jupyter:能在浏览器中创建和共享代码、方程、说明文档。实际是一个基于Tornado框架的Web应用,使用MQ进行消息管理。
scikit-image:图像预处理。
librosa:音频特征提取库
nltk:自然语言处理库
keras:第一个被添加到tensorflow核心中的高级别框架,成为tensorflow的默认API
tflearn:另一个支持tensorflow的第三方框架
三、tensorboard可视化
PlayGround是一个简单神经网络的在线演示,可视化了神经网络的训练过程。
Tensorboard是tensorflow自带的一个强大的可视化工具,也是一个Web应用程序套件。通过运行一个本地服务器,来监听6006端口。
可视化时,需要给程序中必要的节点添加摘要(summary),摘要会收集该节点的数据,并标记上第几部、时间戳等标记,写入事件文件(event file)中。tf.summary.FileWriter类用于在目录中创建事件文件,并且向文件中添加摘要和事件,用于在tensorboard中展示。
目前,tensorboard支持7种可视化。
SCALARS:展示训练过程中的准确率、损失值、权重/偏置的变化情况
IMAGES:训练过程中记录的图像
AUDIO:训练过程中记录的音频
GRAPHS:模型的数据流图,以及训练在各个设备上消耗的内存时间
DISTRIBUTIONS:训练过程中记录的数据的分布图
HISTOGRAMS:训练过程中记录的数据的柱状图
EMBEDDINGS:展示词向量(如word2vec)后的投影分布
四、tensorflow基础知识
tensorflow系统框架:
网络通信层:gRPC和远程直接数据存取。分布式计算时需要用到
设备层:tensorflow分别在CPU、GPU、FPGA等设备上的实现,即对上层提供一个统一的接口,使上层只关注逻辑,不注重上层
数据操作层:包括卷积函数,激活函数等操作
图计算层:本地计算图和分布式计算图的实现。(包含图的创建、编译、优化和执行)
API层:调用API层,实现深度学习网络模型
设计理念:
编程模式分为命令式编程和符号式编程。tensorflow是一种符号式编程,是先定义各种变量,然后建立一个数据流图,在数据流图中规定各个变量之间的计算关系,最后需要对数据流图进行编译,此时数据流图还是个空壳,里面没有实际数据,只有把需要运算的输入放进去,才能在整个模型中形成数据流,从而形成输出值。数据流图中的节点实际上对应的是tensorflow API中的一个操作,并没有真正去运行。
tensorflow设计的运算都要放进图中,将图的定义和图的运行完全分开。图的运行只发生在回话中,开启会话后,就可以用数据填充节点,进行运算。关闭会话后,就不能进行运算了。因此会话提供了操作运行和tensor求值的环境。
模型相关:
边:实线边表示数据依赖,代表张量,虚线边表示控制依赖
节点:又称为算子,代表一个操作(OP)。tensorflow中所有的计算都会被转化为计算图上的节点。与操作相关的代码位于/tensorflow/python/ops/目录下,每个操作函数都调用了gen-math_ops.py中的方法,随后又调用了/tensorflow/core/kernels/下的核函数实现。
图:如何创建图?构建图的第一步是创建各个节点
会话:启动图的第一步是创建一个Session对象。一般模式是,建立会话,此时生成一张空图,在会话中添加节点和边,形成一张图,然后执行。相关代码位于/tensorflow/python/client/session.py
设备:tensorflow为了实现分布式执行操作,充分利用计算资源,可以明确指定操作在哪个设备上执行,相关代码位于/tensorflow/python/framework/device.py
变量:使用tf.Variable()构造函数,在途中有固定位置,不可以随意流动。初始值决定其形状和类型。相关代码位于/tensorflow/python/ops/variables.py
内核:操作是对抽象操作的一个统称,内核则是能够运行在特定设备上的一种对操作的实现,因此同一操作可能会对应多个内核。定义操作时,需要把新操作和内核通过注册的方式添加到系统中。
常用API:
图:与图相关的API均位于tf.Graph中
操作:与操作相关的API均位于tf.Operation中
张量:与张量相关的API均位于tf.Tensor中
可视化:与可视化相关的API均位于tf.summary中
变量作用域:name_scope,variable_scope
variable_scope主要是给variable_name加前缀,也可以给op_name加前缀;name_scope是给op_name加前缀;
批标准化:
批标准化是为了克服神经网络层数加深导致难以训练而诞生的。
统计学习里面有一个ICS(Internal Covariate Shift)理论,即训练数据和测试数据分布相同时,模型效果较好。当分布不同,模型就没有较好的泛化能力,解决思路就是根据训练样本和目标样本的比例对训练样本做一个校正,通过批标准化来规范某些层或所有层的输入,从而固定每层输入信号的均值和方差。
神经元函数及优化方法:常用API:
激活函数
tf.nn.relu() tf.nn.sigmoid() tf.nn.tanh() tf.nn.elu() tf.nn.bias_add() tf.nn.crelu() tf.nn.relu6() tf.nn.softplus() tf.softsign() tf.nn.dropout()
卷积函数
tf.nn.convolution(input, filter, padding, strides=None,
dilation_rate=None, name=None, data_format=None)
tf.nn.conv2d(input,filter, strides, padding, use_cudnn_on_gpu=None,data_format= None, name=None)
tf.nn.depthwise_conv2d (input, filter, strides, padding, rate=None, name=None,data_format=None)
tf.nn.separable_conv2d(input, depthwise_filter,pointwise_filter,strides, padding,rate=None, name=None, data_format=None)
tf.nn.atrous_conv2d(value, filters, rate, padding, name=None)
tf.nn.conv2d_transpose(value, filter, output_shape, strides, padding='SAME',
data_format='NHWC', name=None)
tf.nn.conv1d(value,filters, stride, padding, use_cudnn_on_gpu=None,
data_format= None, name=None)
tf.nn.conv3d(input,filter, strides, padding, name=None)
tf.nn.conv3d_transpose(value, filter, output_shape, strides, padding='SAME', name=None)
tf.nn.avg_pool(value, ksize, strides, padding, data_format='NHWC',name=None)
tf.nn.max_pool(value, ksize, strides, padding, data_format='NHWC',name=None)
tf.nn.max_pool_with_argmax(input, ksize, strides, padding,Targmax=None, name=None)
tf.nn.avg_pool3d(input, ksize, strides, padding,name=None)
tf.nn.max_pool3d(input, ksize, strides, padding,name=None)
tf.nn.fractional_avg_pool(value, pooling_ratio, pseudo_random=None,overlapping=None,
deterministic=None, seed=None, seed2=None, name=None)
tf.nn.fractional_max_pool(value, pooling_ratio, pseudo_random=None,overlapping=None,
deterministic=None, seed=None, seed2=None, name=None)
tf.nn.pool(input, window_shape, pooling_type, padding,dilation_rate=None, strides=None,
name=None, data_format=None)
tf.nn.sigmoid_cross_entropy_with_logits(logits,targets, name=None)
tf.nn.softmax(logits, dim=-1, name=None)
tf.nn.log_softmax(logits, dim=-1, name=None)
tf.nn.softmax_cross_entropy_with_logits(logits,labels, dim=-1, name=None)
tf.nn.sparse_softmax_cross_entropy_with_logits(logits,labels, name=None)
class tf.train.GradientDescentOptimizer
class tf.train.AdadeltaOptimizer
class tf.train.AdagradOptimizer
class tf.train.AdagradDAOptimizer
class tf.train.MomentumOptimizer
class tf.train.AdamOptimizer
class tf.train.FtrlOptimizer
class tf.train.RMSPropOptimizer
训练好一个神经网络模型后,希望能够将其应用在预测数据上。如何将模型存储起来呢?同时,对于一个已经存储起来的模型,在将其应用在预测数据上时又如何加载呢?
生成检查点文件:拓展名一般为.ckpt,通过在tf.train.Saver对象上调用Saver.save()生成,包含权重以及变量,不包含图结构。
init=tf.initialize_all_variables() saver=tf.train.Saver() with tf.Session() as sess: sess.run(init) save_path=saver.save(sess,'pptsaver/ppt.ckpt')
一般会生成三个文件,第一个是.ckpt.meta文件,它保存了tensorflow计算图的结构;第二个是.ckpt,保存了程序中每一个变量的取值;第三个是chekepoint文件,保存了一个目录下所有的模型文件列表。
生成图协议文件:二进制文件,拓展名一般为.pb,用tf.train.write_graph()保存,只包含图结构,不含权重。使用tf.import_graph_def()来加载图形。