1. TensorFlow常用关键词详解
1.1 边
Tensorflow的边有两种连接关系:数据依赖和控制依赖。其中,实现边表示数据依赖,即张量。在机器学习算法中,张量在数据流图中从前往后流动一遍就完成了一次向前传播(forward propagation),而残差从后向前流动一遍就完成了一次反向传播(backward propagation)。虚线边表示控制依赖,可以用于控制操作的运行,这被用来确保happen-before关系,这类边上没有数据流过,但源节点必须在目的节点开始执行前完成执行。常用代码如下:
tf.Graph.control dependencies(control_inputs)
1.2 节点
图中的节点又称为算子,它代表一个操作,如加减乘除这样的数学运算操作,Concat、Split这样的数组运算操作,MatMul、MatrixInverse这样的矩阵运算操作,SoftMax、Sigmoid、ReLU这样的神经网络构建操作,Save、Restore这样的检查点操作,Enqueue、Dequeue这样的队列和同步操作,Merge、Switch这样的控制张量操作。
1.3 图
Tensorflow中涉及的运算都要放在图中。典型的图创建如下所示:
import tensorflow as tf
#创建一个常量运算操作,产生一个1*2矩阵
matrix1 = tf.constant([[3.,3.]])
#创建另一个常量运算操作,产生一个2*1矩阵
matrix2 = tf.constant([[2.],[2.]])
#创建一个矩阵乘法运算,把matrix1和matrix2作为输入
#并以product代表矩阵乘法的结果
product = tf.matmul(matrix1,matrix2)
1.4 会话
创建图之后,要想让图启动,首先需要创建一个会话(Session)对象,开启会话后,就可以用数据去填充节点,进行计算。会话主要提供操作运行和Tensor求值的环境。在Python中通过tf.Session来创建会话执行各项操作。如下所示:
#创建会话
with tf.Session() as sess:
result = sess.run([product])
print(result)
在上述创建会话过程中,调用Session对象的run()方法来执行图时,传入Tensor的过程称为填充(feed),返回结果的过程称为取回(fetch)。
1.5 批标准化
批标准化(batch normalization,BN)时为了克服神经网络层数加深导致难以训练而诞生的。随着神经网络深度的加深,训练会越来越慢,收敛速度也会很慢,常常会导致梯度弥散问题(vanishing gradient problem)。
(1)批标准化处理方法
批标准化一般用在非线性映射(激活函数)之前,对x=Wu+b做规范化处理,使得结果(输出信号各个维度)的均值为0,方差为1。让每一层的输入有一个稳定的分布会有利于网络的训练。
(2)批标准化优点
批标准化通过规范化让激活函数分布在线性区间,结果就是加大了梯度,让模型可以更加大胆地进行梯度下降,能加大搜索的步长,加快收敛的速度,更容易跳出局部最小值,此外,这样做也破坏了原来的数据分布,一定程度上缓解了过拟合。因此,在遇到神经网络收敛速度很慢或梯度爆炸(gradient explode)等无法训练的情况下,可以尝试用批标准化来解决。