基本概念
TensorFlow:tensor+flow(张量,流表示张量的计算)
所有的计算都在‘计算图’上执行,有默认的计算图,一般都重新定义一个计算图。计算图之间互不干扰,可以理解成一个命名空间。
sess两种加载方式
import tensorflow as tf
matrix1=tf.constant([[3,3]])
matrix2=tf.constant([[2],[2]])
product=tf.matmul(matrix1,matrix2)
##method1
#sess=tf.Session()
#result=sess.run(product)
#print(result)
#sess.close()
#method2
with tf.Session() as sess:
result2=sess.run(product)
print(result2)
张量的三个属性
名字(name),维度(shape),类型(type)
变量和输入
TensorFlow中的常量、变量有对应的函数声明,变量需要初始化。输入需要用tf.placeholder
TensorFlow的计算在Session中
TensorFlow定义了变量之后,需要明确的调用这个变量初始化过程,也可以用下面得函数实现初始化所有变量,可以用print sess.run(‘‘)打印出变量**
乘法操作
是每个位置上对应元素的乘积,tf.matmul是矩阵乘积
非线性激活函数
链接
给定的链接中,可以选择数据集、激活函数、损失函数等。
- 在非线性可分的数据集中,使用线性激活函数不可分,换成非线性激活函数之后就可分了。那么这几个非线性激活函数有什么区别呢?可以发现不同的非线性激活函数的决策边界不一样,说明后期可以研究下不同的激活函数对模型有什么影响。
- TensorFlow提供了7种不同的非线性激活函数,常用的是这三个
深度网络
损失函数
分类问题损失函数用softmax+交叉熵(二分类问题的损失函数是特例);回归问题损失函数常用的是平方损失;TensorFlow也支持自定义损失函数
交叉熵
,通过softmax保证神经网络的输出变成一个概率分布
交叉熵刻画的是两个概率分布之间的距离;交叉熵函数不是对称的(),刻画的是通过概率分布
来表达概率分布
的困难程度,
表示正确分布,
表示预测值。当
时,交叉熵值最小。
梯度下降
训练神经网络时,参数的初始值会很大程度影响最后得到的结果,只有当损失函数为凸函数时,梯度下降算法才能保证达到全局最优解。
优化点
参数初始值对结果影响很大,随机初始化
bacth梯度下降
设置学习率:太大参数容易摇摆,太小大大降低优化速度;
正则化
L1正则、L2正则、也可以同时使用。,
刻画模型复杂度,
表示所有参数,包括权重
和偏置
。一般来说模型复杂度只有权重
决定。
TensorFlow中有两种方式来写,第一种如下,这样的方式可能导致损失函数loss的定义很长,可读性差易出错。TensorFlow提供了集合来解决这个问题。
滑动平均模型
在采用随机梯度下降法训练模型时,使用滑动平均模型在很多应用中都可以一定程度提高最终模型在测试数据上的表现。滑动平均值,是对参数的更新做一个改进。//todo 需要再理解一下
总结
神经网络的结构(隐层、激活函数)对最终模型有本质性的影响;第二重要的是正则化损失函数;
数据集mnist和demo
mnist数据集,TensorFlow提供了一个类,让处理mnist数据集更加方便,可以获取训练集、验证集、测试集,还可以获取下一个batch
TensorFlow提供了mnist数据集60000,包括训练集和测试集10000。但是TensorFlow的函数可以自动把mnist数据集划分成train(55000)、validation(5000)、test(10000)。
from tensorflow.examples.tutorials.mnist import input_data
//路径中没有,会自动下载到该路径
mnist = input_data.read_data_sets("/path/to/MNIST_data", one_hot=True)
batch_size = 100
x, y = mnist.train.next_batch(batch_size)
print x.shape
变量管理
TensorFlow提供 tf.Variable函数来创建一个变量,提供tf.get_variable函数来创建或获取变量,创建时和前者功能是等价的。可以通过tf.variable_scope函数来控制tf.get_variable函数获取已经创建过的变量,tf.variable_scope相当于一个命名空间
tf.variable
TensorFlow模型持久化
model.ckpt.meta:保存TensorFlow计算图的结构
model.ckpt:保存了TensorFlow程序中每一个变量的取值
checkpoint文件:保存了一个目录下所有的模型文件列表
持久化的四种方式
- 可以restore ckpt文件,读取变量的取值,不过需要定义计算图上的所有运算
- 如果不希望重复定义图上的运算,可以直接加载已经持久化的图ckpt.meta文件,也要restore ckpt文件
- 给变量重命名,方便使用变量的滑动平均值
- 有时只需要知道如何从神经网络的输入层经过前向传播计算得到输出层即可,不需要类似于变量初始化、模型保存等辅助节点的信息。可以使用convert_variables_to_constants,通过这个函数可以将计算图中的变量及其取值通过常量的方式保存,这个整个TensorFlow计算图可以统一存放在一个文件中
持久化原理及数据格式
TensorFlow持久化是利用了Protocol Buffer实现的,为了方便调试,TensorFlow提供了export_meta_graph函数,支持以json格式到处MetaGraphDef Protocol Buffer。可以结合json、tensorboard来理解下TensorFlow的计算图。
最佳实践样例
完整实现,包括各种优化技巧
重构之后的代码被拆成3个程序
- mnist_inference.py:定义了前向传播的过程以及神经网络中的参数
- mnist_train.py:定义了神经网络的训练过程
- mnist_eval.py:定义了测试过程
卷积网络
LeNet-5
不同卷积层通过串联的方式连接在一起Inception-v3
将不同的卷积层通过并联的方式结合在一起;为了更好的实现这种复杂模型,可以使用TensorFlow-Slim实现同样结构的神经网络。
迁移学习
目的
为了解决标注数据和训练时间的问题,将一个问题上训练好的模型通过简单的调整使其适用于一个新的问题。
图像数据预处理
目的
对图像进行预处理,使训练得到的神经网络模型尽可能小的被无关因素(图像的亮度、对比度)影响;复杂的预处理过程可能会导致训练效率的下降(TensorFlow中多线程输入数据)。
TFRecord输入数据格式
TFRecord样例程序-将mnist输入数据转化为TFRecord
TensorFlow图像处理函数
图像编码处理
图像在存储时并不是直接记录矩阵中的数字,而是经过压缩编码之后的结果。所以将一张图片还原成一个三维矩阵,需要解码的过程。TensorFlow中提供了对jpeg和png格式图像的编码/解码函数。
图像大小调整
通过算法使得新的图像尽量保存原始图像上的所有信息。
TensorFlow提供了四种不同的方法(双线性插值法、最近邻居法、双三次插值法、面积插值法),并且将它们封装到了tf.image.resize_images函数。
TensorFlow提供API对图像进行裁剪或填充
图像翻转
图像色彩调整
亮度
对比度
饱和度
色相
<br /><br />

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