TensorFlow中优化DNN模型tips
2017-09-08 09:44
267 查看
TensorFlow中优化DNN模型tips
一、学习率的设置
指数衰减法–tf.train.exponential_decay
exponential_decay(learning_rate, global_step, decay_steps, decay_rate, staircase=False, name=None)
通过这个函数,可以先使用较大的学习率来快速得到一个比较优的解,然后随着迭代的继续逐步减小学习率,使得模型在训练后更加稳定,即指数级的减小学习率。
exponential_decay实现了以下代码的功能:
decayed_learning_rate = \ learning_rate * decay_rate ^(global_step / decay_steps)
其中:
decayed_learning_rate:为每一轮优化时使用的学习率;
learning_rate:为事先设定的初始学习率;
decay_rate:为衰减系数;
decay_steps:为衰减速度;
staircase:可以通过设置来选择不同的衰减方式,默认值为False;当为True时,global_step/decay_stpes会被转化成整数,学习率成为一个阶梯函数。
二、正则化
正则化时,即在优化的时候不是直接优化损失函数J(θ),而是优化J(θ)+λR(w)。L1、L2正则化
常用的R(w)有两种:L1正则化:R(w)=∥w∥1=∑i|wi|
L2正则化:<
13089
span class="MathJax" id="MathJax-Element-5-Frame" role="textbox" aria-readonly="true">R(w)=∥w∥22=∑i∣∣w2i∣∣
无论是那种正则化方式,基本思想都是希望通过限制权重的大小,使得模型不能任意拟合训练数据中的随机噪音。
其中,L1正则化会让参数变得更稀疏,而L2正则化则不会。所谓参数变得更稀疏是指会有更多的参数变为0,这样可以达到类似特征选取的功能。之所以L2正则化不会让参数变得稀疏是因为当参数很小时,如0.001,这个参数的平方基本上就可以忽略了,于是模型不会进一步将这个参数调整为0。
其次,L1正则化的计算公式不可导,而L2正则化公式可导,在优化时需要计算损失函数的偏导数,所以对含有L2正则化损失函数的优化要更加简洁,优化带L1正则化的损失函数要更加复杂。
在实践中,可以将L1正则化和L2正则化同时使用:
R(w)=∑iα|wi|+(1−α)w2i
带L2正则化的损失函数:
w = tf.Variable(tf.random_normal([2,1],stddev=1, seed=1)) y = tf.matmul(x, w) loss = tf.reduce_mean(tf.square(y_ - y)) + tf.contrib.layers.l2_regularize(lambda)(w)
当神经网络结构复杂之后,定义网络结果的部分和计算损失函数的部分可能不在同一个函数中,这样通过变量方式计算损失函数就不方便了。此时TensorFlow提供结合(collection)。如下为计算一个5层神经网络带L2正则化的损失函数计算方法。
import tensorflow as tf # 定义一个获取权重,并自动加入正则项到损失的函数 def get_weight(shape, lambda1): var = tf.Variable(tf.random_normal(shape), dtype=tf.float32) tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(lambda1)(var)) return var # 定义神经网络 x = tf.placeholder(tf.float32, shape=(None, 2)) y_ = tf.placeholder(tf.float32, shape=(None, 1)) sample_size = len(data) # 每层节点的个数 layer_dimension = [2,10,5,3,1] n_layers = len(layer_dimension) cur_layer = x in_dimension = layer_dimension[0] # 循环生成网络结构 for i in range(1, n_layers): out_dimension = layer_dimension[i] weight = get_weight([in_dimension, out_dimension], 0.003) bias = tf.Variable(tf.constant(0.1, shape=[out_dimension])) cur_layer = tf.nn.elu(tf.matmul(cur_layer, weight) + bias) in_dimension = layer_dimension[i] y= cur_layer # 损失函数的定义。 mse_loss = tf.reduce_sum(tf.pow(y_ - y, 2)) / sample_size tf.add_to_collection('losses', mse_loss) loss = tf.add_n(tf.get_collection('losses'))
三、滑动平均模型 – tf.train.ExponentialMovingAverage
滑动平均模型,可以在采用随机梯度下降的算法中,在一定程度上提高最终模型在测试数据上的表现。shadow_variable=decay×shadow_variable+(1−decay)×variable
其中:
shadow_variable:影子变量;
variable:待更新的变量;
num_updates:动态设置decay的大小。
decay:衰减率;
decay决定了模型更新的速度,decay越大模型就越趋于稳定。实际应用中,decay一般会设为接近1的数,如0.999或0.9999。
__init__( decay, num_updates=None, zero_debias=False, name='ExponentialMovingAverage' )
如果使用num_updates,则每次使用的衰减率为:
min{decay,1+num_updates10+num_updates}
# 定义变量及滑动平均类 v1 = tf.Variable(0, dtype=tf.float32) step = tf.Variable(0, trainable=False) ema = tf.train.ExponentialMovingAverage(0.99, step) maintain_averages_op = ema.apply([v1]) # 查看不同迭代中变量取值的变化 with tf.Session() as sess: # 初始化 init_op = tf.global_variables_initializer() sess.run(init_op) print sess.run([v1, ema.average(v1)]) # 更新变量v1的取值 sess.run(tf.assign(v1, 5)) sess.run(maintain_averages_op) print sess.run([v1, ema.average(v1)]) # 更新step和v1的取值 sess.run(tf.assign(step, 10000)) sess.run(tf.assign(v1, 10)) sess.run(maintain_averages_op) print sess.run([v1, ema.average(v1)]) # 更新一次v1的滑动平均值 sess.run(maintain_averages_op) print sess.run([v1, ema.average(v1)]) output: [0.0, 0.0] [5.0, 4.5] [10.0, 4.5549998] [10.0, 4.6094499]
相关文章推荐
- TensorFlow优化模型之正则化
- 学习笔记TF048:TensorFlow 系统架构、设计理念、编程模型、API、作用域、批标准化、神经元函数优化
- 阿里 NIPS 2017 Workshop 论文:基于 TensorFlow 的深度模型训练 GPU 显存优化
- cuDNN 5对RNN模型的性能优化
- 【tensorflow】】模型优化(一)指数衰减学习率
- TensorFlow优化之滑动平均模型
- TensorFlow代码结构优化tips
- 深度学习模型的优化算法及tensorflow实现
- tensorflow模型优化技巧
- Tensorflow实战学习(四十八)【系统架构,设计理念,编程模型,API,作用域,批标准化,神经元函数优化】
- 算法移植优化(六)tensorflow模型移植推理优化
- 谷歌开源图像分类工具TF-Slim,定义TensorFlow复杂模型
- TensorFlow 下构建高性能神经网络模型的最佳实践
- Tensorflow使用的预训练的resnet_v2_50,resnet_v2_101,resnet_v2_152等模型预测,训练
- TensorFlow实战系列8--滑动平均模型
- TensorFlow模型op的保存和加载(含演示代码)
- 我用 tensorflow 实现的“一个神经聊天模型”:一个基于深度学习的聊天机器人
- tensorflow中模型的保存和恢复
- 结合盒子模型,优化明信片
- 解析Tensorflow官方PTB模型的demo