基本概念

TensorFlow:tensor+flow(张量,流表示张量的计算)
所有的计算都在‘计算图’上执行,有默认的计算图,一般都重新定义一个计算图。计算图之间互不干扰,可以理解成一个命名空间。

sess两种加载方式

  1. import tensorflow as tf
  2. matrix1=tf.constant([[3,3]])
  3. matrix2=tf.constant([[2],[2]])
  4. product=tf.matmul(matrix1,matrix2)
  5. ##method1
  6. #sess=tf.Session()
  7. #result=sess.run(product)
  8. #print(result)
  9. #sess.close()
  10. #method2
  11. with tf.Session() as sess:
  12. result2=sess.run(product)
  13. print(result2)

张量的三个属性

名字(name),维度(shape),类型(type)

image.png

变量和输入

TensorFlow中的常量、变量有对应的函数声明,变量需要初始化。输入需要用tf.placeholder
image.png

TensorFlow的计算在Session中

TensorFlow定义了变量之后,需要明确的调用这个变量初始化过程,也可以用下面得函数实现初始化所有变量,可以用print sess.run(‘‘)打印出变量
image.png**

乘法操作

  1. ![](https://cdn.nlark.com/yuque/__latex/3389dae361af79b04c9c8e7057f60cc6.svg#card=math&code=%2A&height=11&width=8)是每个位置上对应元素的乘积,tf.matmul是矩阵乘积

非线性激活函数

链接
给定的链接中,可以选择数据集、激活函数、损失函数等。

  1. 在非线性可分的数据集中,使用线性激活函数不可分,换成非线性激活函数之后就可分了。那么这几个非线性激活函数有什么区别呢?可以发现不同的非线性激活函数的决策边界不一样,说明后期可以研究下不同的激活函数对模型有什么影响。
  2. TensorFlow提供了7种不同的非线性激活函数,常用的是这三个

image.png
image.png
image.png

深度网络

简单的感知器(不包含任何隐层)无法解决异或问题
image.png

损失函数

分类问题损失函数用softmax+交叉熵(二分类问题的损失函数是特例);回归问题损失函数常用的是平方损失;TensorFlow也支持自定义损失函数

交叉熵

Tensorflow入门 - 图12,通过softmax保证神经网络的输出变成一个概率分布
交叉熵刻画的是两个概率分布之间的距离;交叉熵函数不是对称的(Tensorflow入门 - 图13),刻画的是通过概率分布Tensorflow入门 - 图14来表达概率分布Tensorflow入门 - 图15的困难程度,Tensorflow入门 - 图16表示正确分布,Tensorflow入门 - 图17表示预测值。当Tensorflow入门 - 图18时,交叉熵值最小。
image.png

梯度下降

训练神经网络时,参数的初始值会很大程度影响最后得到的结果,只有当损失函数为凸函数时,梯度下降算法才能保证达到全局最优解。

优化点

参数初始值对结果影响很大,随机初始化

bacth梯度下降

设置学习率:太大参数容易摇摆,太小大大降低优化速度;

Tensorflow入门 - 图20
Tensorflow入门 - 图21

正则化

L1正则、L2正则、也可以同时使用。Tensorflow入门 - 图22Tensorflow入门 - 图23刻画模型复杂度,Tensorflow入门 - 图24表示所有参数,包括权重Tensorflow入门 - 图25和偏置Tensorflow入门 - 图26。一般来说模型复杂度只有权重Tensorflow入门 - 图27决定。
TensorFlow中有两种方式来写,第一种如下,这样的方式可能导致损失函数loss的定义很长,可读性差易出错。TensorFlow提供了集合来解决这个问题。
image.png
image.png
image.png

滑动平均模型

在采用随机梯度下降法训练模型时,使用滑动平均模型在很多应用中都可以一定程度提高最终模型在测试数据上的表现。滑动平均值,是对参数Tensorflow入门 - 图31的更新做一个改进。//todo 需要再理解一下
image.png
image.png

总结

神经网络的结构(隐层、激活函数)对最终模型有本质性的影响;第二重要的是正则化损失函数;

数据集mnist和demo

mnist数据集,TensorFlow提供了一个类,让处理mnist数据集更加方便,可以获取训练集、验证集、测试集,还可以获取下一个batch
TensorFlow提供了mnist数据集60000,包括训练集和测试集10000。但是TensorFlow的函数可以自动把mnist数据集划分成train(55000)、validation(5000)、test(10000)。

  1. from tensorflow.examples.tutorials.mnist import input_data
  2. //路径中没有,会自动下载到该路径
  3. mnist = input_data.read_data_sets("/path/to/MNIST_data", one_hot=True)
  4. batch_size = 100
  5. x, y = mnist.train.next_batch(batch_size)
  6. print x.shape

变量管理

TensorFlow提供 tf.Variable函数来创建一个变量,提供tf.get_variable函数来创建或获取变量,创建时和前者功能是等价的。可以通过tf.variable_scope函数来控制tf.get_variable函数获取已经创建过的变量,tf.variable_scope相当于一个命名空间
tf.variable
image.png
image.png
image.png

TensorFlow模型持久化

model.ckpt.meta:保存TensorFlow计算图的结构
model.ckpt:保存了TensorFlow程序中每一个变量的取值
checkpoint文件:保存了一个目录下所有的模型文件列表

持久化的四种方式

  1. 可以restore ckpt文件,读取变量的取值,不过需要定义计算图上的所有运算
  2. 如果不希望重复定义图上的运算,可以直接加载已经持久化的图ckpt.meta文件,也要restore ckpt文件
  3. 给变量重命名,方便使用变量的滑动平均值
  4. 有时只需要知道如何从神经网络的输入层经过前向传播计算得到输出层即可,不需要类似于变量初始化、模型保存等辅助节点的信息。可以使用convert_variables_to_constants,通过这个函数可以将计算图中的变量及其取值通过常量的方式保存,这个整个TensorFlow计算图可以统一存放在一个文件中

image.png
image.png
image.png

持久化原理及数据格式

TensorFlow持久化是利用了Protocol Buffer实现的,为了方便调试,TensorFlow提供了export_meta_graph函数,支持以json格式到处MetaGraphDef Protocol Buffer。可以结合json、tensorboard来理解下TensorFlow的计算图。

最佳实践样例

完整实现,包括各种优化技巧
重构之后的代码被拆成3个程序

  1. mnist_inference.py:定义了前向传播的过程以及神经网络中的参数
  2. mnist_train.py:定义了神经网络的训练过程
  3. mnist_eval.py:定义了测试过程

    卷积网络

    LeNet-5

    不同卷积层通过串联的方式连接在一起

    Inception-v3

    将不同的卷积层通过并联的方式结合在一起;为了更好的实现这种复杂模型,可以使用TensorFlow-Slim实现同样结构的神经网络。

image.png
image.png

迁移学习

目的

为了解决标注数据和训练时间的问题,将一个问题上训练好的模型通过简单的调整使其适用于一个新的问题。
image.png

图像数据预处理

目的

对图像进行预处理,使训练得到的神经网络模型尽可能小的被无关因素(图像的亮度、对比度)影响;复杂的预处理过程可能会导致训练效率的下降(TensorFlow中多线程输入数据)。

TFRecord输入数据格式

image.pngTFRecord样例程序-将mnist输入数据转化为TFRecord

TFRecord样例程序

TensorFlow图像处理函数

图像编码处理

图像在存储时并不是直接记录矩阵中的数字,而是经过压缩编码之后的结果。所以将一张图片还原成一个三维矩阵,需要解码的过程。TensorFlow中提供了对jpeg和png格式图像的编码/解码函数。

图像大小调整

图像大小调整有两种方式

通过算法使得新的图像尽量保存原始图像上的所有信息。

TensorFlow提供了四种不同的方法(双线性插值法、最近邻居法、双三次插值法、面积插值法),并且将它们封装到了tf.image.resize_images函数。
image.png
image.png

TensorFlow提供API对图像进行裁剪或填充

image.png

图像翻转

image.png
image.png

图像色彩调整

亮度

对比度

饱和度

色相

  1. <br />![image.png](https://cdn.nlark.com/yuque/0/2019/png/365417/1560654424195-1a887e52-e70a-4759-8d0f-0a5853bc0d3a.png#align=left&display=inline&height=474&name=image.png&originHeight=948&originWidth=1372&size=1040745&status=done&width=686)<br />![image.png](https://cdn.nlark.com/yuque/0/2019/png/365417/1560654643295-d15c4c50-845e-4031-a4e3-3bec67b44897.png#align=left&display=inline&height=651&name=image.png&originHeight=1302&originWidth=1464&size=1857124&status=done&width=732)

Tensorflow入门 - 图49image.png处理标注框

通过tf.image.draw_bounding_boxes函数在图像中加入标注框,通过tf.image.sample_distored_bounding_box函数来完成随机截取图像的过程

图像预处理完整样例

图像预处理完整样例

多线程输入数据处理框架

为了避免图像预处理成为神经网络模型训练效率的瓶颈,TensorFlow提供了一套多线程处理输入数据的框架。

队列与多线程

FIFOQueue:先进先出队列;RandomShuffleQueue会将队列中的元素打乱,每次出兑操作得到的是从当前队列所有元素中随机选择一个

使用队列来实现多线程输入数据

TensorFlow提供了辅助函数来更好的协同不同的线程、

tf.Coordinator,tf.QueueRunner类;should_stop、request_stop、join

输入文件队列

组合训练数据

输入数据处理框架

循环神经网络

TensorBoard可视化

使用方法

image.png

命名空间和可视化

GRAPHS部分

TensorBoard计算图中画出了声明变量、常量的这些节点,网络一复杂,这些占比又比较大,会把用户关注的运算埋没掉。因此TensorBoard支持通过TensorFlow命名空间来整理可视化效果图上的节点。在TensorBoard的默认视图中,TensorFlow计算图中同一个命名空间下的所有节点会被缩略成一个节点,只有顶层命名空间中的节点才会被显示在TensorBoard可视化效果图上;tf.variable_scope和tf.name_scope函数在大部分情况下是等价的,唯一的区别是在使用tf.get_variable函数时
主图、辅图:TensorBoard会自动将连接比较多的节点放在辅助图中,使得主图的结构更加清晰
支持手工方式添加删除节点
TensorBoard还可以展示TensorFlow计算图上每个节点的基本信息以及运行时消耗的时间和空间,但是需要添加部分代码,将计算节点的运行时间和消耗的内存写入TensorBoard的日志文件中。

监控指标可视化:EVENTS,IMAGES,AUDIO,HIATOGRAMS

image.png

TensorFlow计算加速

TensorFlow使用GPU

深度学习训练并行模式

多GPU并行

分布式TensorFlow