tensorflow基础知识(二)
最下层是网络通信层和设备管理层,网络设备层包括gprc和远程直接数据存取(RDMA),设备管理层包括tensorflow在CPU、GPU、FPGA等设备的实现,对上层提供了一个统一的接口。使上层只需要处理卷积等逻辑而不需要关心在硬件上的卷积的实现过程。
其上是数据操作层,主要包括卷积函数,**函数,再往上是图层。
Tensorflow是符号式编程,先定义各种变量,然后建立数据流图,在数据流图中规定各个变量之间的计算关系,最后需要对数据流图进行编译。但是数据流图函数空壳,里面没有任何实际数据,只有把需要运算的输入放进去后,才能在整个模型中形成数据流,从而形成输出值。
tensorflow是用数据流图做计算的,图中包含输入(input)、塑形(reshape)、relu层(relu layer)、Logit层(Logit layer)、Softmax、交叉熵(cross entropy)、梯度(gradient)、SDG训练等部分。
它的计算过程是,经过塑形后,一层一层进行前向传播运算。relu层里会有两个参数。在输出前通过relu进行非线性处理,然后进入logit层,用softmax来计算输出结果中各个类别的概率分布。用交叉熵来度量两个概率分布之间的相似性。然后开始计算梯度,随后进入SDG训练,也就是反向传播的过程。
tensorflow的数据流图是有节点(node)和边(edge)组成的有向无环图
边有两种连接关系,数据依赖和控制依赖,张量在数据流图中从前往后流动一遍就完成了一次前向传播,而残差从后往前流动一次就完成了一次反向传播
节点是一个操作,一般用来表示施加的数学运算,也可以表示数据输入的起点和输出的终点,或者是读取写入持久变量的终点。
图:构建图的第一步是创建各个节点。
会话;启动图的第一步是创建一个session对象,会话提供在图中执行操作的一些方法,一般的模式是,建立会话,此时会生成一张空图,在会话上添加节点和边,形成一张图,然后执行。
在调用session对象run()方法来执行图时,传入一些tensor,这个过程叫填充,返回的结果类型根据输出的类型而定,这个过程叫取回。
会话是图交互的一个桥梁,一个会话可以有很多图,会话可以修改图的结构,也可以往图中诸如数据进行计算。两个API,extend操作是在fraph中添加节点和边,run操作是输入计算的结点和填充必要的数据后,进行运算,并输出结果。
设备:是指一块可以用来运算平企鹅拥有自己地址空间的硬件,
变量:一种特殊的数据,他在图中有固定的位置,不想普通张量那样可以流动,例如,创建一个变量张量,使用tf.variable()构造函数,这个构造函数需要一个初始值,初始值的形状和类型决定了这个变量的形状和类型:
tensorflow还提供了填充机制,可以在构建图的时候tf.placeholder()临时代替任意操作的张量,在调用session对象的run()方法去执行图是,使用填充数据作为调用的参数。调用参数结束后,填充数据就消失。
内核:kernel
常用API
图、操作和张量
可视化:可视化时,需要在程序中给必要的节点添加摘要(summary),摘要会收集该节点的数据,并标记上第几部、时间戳等标识,写入事件文件(event file),tf.summary.filewriter类用于在目录中创建事件文件,并且向文件中添加摘要和事件,用来在tensorflow中展示。
tf.summary.scalar(name,tensor,collection=None) 输出包含单个标量值的摘要
tf.summary.histogram(name,values,collections=None) 输出包含直方图的摘要
tf.summary.audio(name,values,collections=none) 输出包含音频的摘要
tf.summary.image(name,tensor,max_outputs=3,collections=None) 输出包含图片的摘要
tf.summary.merge(inputs,collections=None,name=None)合并摘要,包含所有输入摘要的值
在tensorflow中有两个作用域,一个是name_scope,另一个时variable_scope,variable_scope主要是给variable_name加前缀,也可以给op_name加前缀,name_scope是给op_name 加前缀。
name_scope为变量划分范围,在可视化中,这表示在计算图中的一个层级,name_scope会影响op_name,不会影响get_variable()创建的变量的结果,而会影响通过variable()创建的变量。
当tf.get_variable_scope().reuse()==false时,variable_scope作用域只能创建新变量,当tf.get_variable_scope().reuse()==true时,作用域可以共享变量。
**函数:运行时**神经网络中某一部分神经元,将**信息向后传入下一层的神经网络。神经网络之所以能够解决非线性问题,主要就是**函数加入了非线性因素,民不了线性模型的表达力,把“**的神经元特征”通过函数保留并映射到下一层。
dropout()一个神经元将以概率keep_prob决定是否抑制,如果被抑制,该神经元的输出就为0,如果不被抑制,那么该神经元的输出值将被放大到原来的1/keep_prob
卷积函数:卷积函数时构建神经网络的重要支架,是在一批函数上扫描的二维过滤器。
池化函数:池化函数一般在卷积的下一层,池化操作是利用一个矩阵窗口在张量上进行扫描,将每个窗口中的值通过取最大或者平均值来减少元素个数,每个池化操作的矩阵窗口大小是由ksize指定的,并且根据步长strides决定移动长度。
分类函数:
优化方法:
如何加速神经网络的训练呢?
目前加速训练的方法都是基本基于梯度下降的,梯度下降是求函数极值的一种方法:
BGD方法:皮梯度下降法,利用现有的参数对训练集中每一个输出生成一个估计输出y‘。然后与实际的y进行比较,统计所有的误差,求平均后得到平均误差,以此作为更新参数的依据。
1)提取训练集中所以内容,以及相关的输出
2)计算梯度和误差并更新权重
这种方法使用所以的数据,能够保证收敛,但是不需要减少学习率,每一步都使用所有的数据,随着训练的进行,速度会越来越慢。
所以将数据拆成一个个批次(batch)
就是SGD法:
还有还多方法不一一举例
模型的存储与加载
训练好一个模型后,我们希望能够将其应用在预测数据上。
1、生成检查点文件(checkpoint file),扩展名一般为.ckpt,通过在tf.train.saver对象上调用saver.save()生成,它包含权重和其他再程序中定义的变量,不包含图结构,如果需要在另一个程序中使用,需要重新创建图结构,并告诉tensorflow如何处理这些权重。
2、生成图协议文件(graph protocol file)这是一个二进制文件,扩展名为.pb,用tf.train.writer_graph()保存,只包含图结构,不包含权重。
模型存储主要是建立一个tf.train.saver()来保存变量,并且指定保存的位置,一般模型的扩展名为.ckpt
.meta文件是训练过程中保存的元数据
队列和线程
(这边等需要的时候再补充)
temsorflow作为编程框架,需要先构建数据流程图,再读取数据,随后进行模型训练、、
预加载数据:在tensorflow图中定义常量或变量来保存所以数据
填充数据:python产生数据,再把数据填充后端
从文件读取数据:从文件中直接读取,让队列管理去器从文件中读取数据