tf.get_default_graph 获取当前默认的计算图
tf.Graph 生成新的计算图
tf.Graph.device 制定运行计算的设备
tf.add_to_collection 将资源加入一个或多个集合中
tf.get_collection 获取一个集合里面的所有资源
通过tf.IntersctiveSession() 函数可以省去将产生的会话注册为默认会话的过程
tf.,matmul() 实现了矩阵乘法的功能
声明一个2×3的矩阵变量方法:(均值为0,标准差为2)
weights = tf.Variable(tf.random_normol([2.3],stddev=2))
tf.global_variables_initializer :实现初始化所有变量
init_op = tf.global_variables_initializer()
sess.run(init_op)
监督学习最重要的思想就是,在已知答案的标注数据集上,模型给出的预测结果要尽量接近真实的答案。
某模型经过Softmax回归之后的预测答案是(0.5,0.4,0.1),正确答案是(1,0,0)那么这个预测和正确答案之间的交叉熵为:
H((1,0,0),(0.5,0.4,0.1))= -(1×log0.5+0×log0.4+0×log0.1)≈0.3
tf.clip_by_value 将一个张量中的数值限制在一个范围之内
tf.log 对张量中所有元素依次求对数
tf.nn.softmax_cross_entropy_with_logits 实现使用了softmax回归后交叉熵的损失函数
cross_rntropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)
其中y代表了原始神经网络的输出结果,y_则给出了标准答案(回归问题解决的是对具体数值的预测)
最常用的损失函数是均方误差(MSE,mean squared error),如下
mse = tf.reduce_mean(tf.square(y_ - y))
y代表了神经网络的输出答案,y_代表了标准答案,这里的“-‘’代表了两个矩阵对应元素的减法
tf.train.exopnential_decay 实现了指数衰减学习率
decayed_learning_rate = \
learning_rate * decay_rate ^ (global_step /decay_steps)
其中,decayed_learning_rate为每一轮优化时使用的学习率,learning_rate为事先设定的初始学习率,decay_rate为衰减系数,decay_steps为衰减速度
tf.train.ExponentialMovingAverage 实现滑动平均模型
滑动平均模型的代码实现
首先明确一点,TensorFlow中的ExponentialMovingAverage()是针对权重weight和偏差bias的,而不是针对训练集的。如果你现在训练集中实现这个效果,需要自己设计代码。
为什么要对w和b使用滑动平均模型呢?因为在神经网络中,
更新的参数时候不能太大也不能太小,更新的参数跟你之前的参数有联系,不能发生突变。一旦训练的时候遇到个“疯狂”的参数,有了滑动平均模型,疯狂的参数就会被抑制下来,回到正常的队伍里。这种对于突变参数的抑制作用,用专业术语讲叫鲁棒性,鲁棒性就是对突变的抵抗能力,鲁棒性越好,这个模型对恶性参数的提抗能力就越强。
在TensorFlow中,ExponentialMovingAverage()可以传入两个参数:衰减率(decay)和数据的迭代次数(step),这里的decay和step分别对应我们的β和num_updates,所以在实现滑动平均模型的时候,步骤如下:
1、定义训练轮数step
2、然后定义滑动平均的类
3、给这个类指定需要用到滑动平均模型的变量(w和b)
4、执行操作,把变量变为指数加权平均值
# 1、定义训练的轮数,需要用trainable=False参数指定不训练这个变量,
# 避免这个变量被计算滑动平均值
global_step = tf.Variable(0, trainable=False)
# 2、给定滑动衰减率和训练轮数,初始化滑动平均类
# 定训练轮数的变量可以加快训练前期的迭代速度
variable_averages = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,
global_step)
# 3、用tf.trainable_variable()获取所有可以训练的变量列表,也就是所有的w和b
# 全部指定为使用滑动平均模型
variables_averages_op = variable_averages.apply(tf.trainable_variables())
# 反向传播更新参数之后,再更新每一个参数的滑动平均值,用下面的代码可以一次完成这两个操作
with tf.control_dependencies([train_step, variables_averages_op]):
train_op = tf.no_op(name="train")
设置完使用滑动平均模型之后,只需要在每次使用反向传播的时候改为使用run.(train_op)就可以正常执行了。
持久化
加载已经持久化的模型
如果不希望重复定义图上的运算,可以直接加载已经持久化的图
export_meta_graph 以json格式导出MetaGraphDef Protocol Buffer