1、反向传播
在所有参数上使用梯度下降,从而使模型在训练集合上损失函数尽量少
常见函数 tf.train.GradientDescentOptimizer
模型优化标准通过损失函数完成
a、回归问题,输出为某个数值,采用MSE 均方差(mean squared error)
b、分类问题 交叉商(cross entropy)
c、自定义损失函数
2、学习率
学习率控制参数更新速度。一般使用指数衰减的学习率,在迭代初期得到较高的下降速度,可以在较小的训练轮数下取得更有收敛度。
注意黄色部分
-
import tensorflow as tf
-
-
LEARNING_RATE_BASE = 0.1 #最初学习率
-
LEARNING_RATE_DECAY = 0.99 #学习率衰减率
-
LEARNING_RATE_STEP = 1 #喂入多少轮BATCH_SIZE后,更新一次学习率,一般设为:总样本数/BATCH_SIZE
-
-
#运行了几轮BATCH_SIZE的计数器,初值给0, 设为不被训练
-
global_step = tf.Variable(0, trainable=False)
-
#定义指数下降学习率
-
learning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE, global_step, LEARNING_RATE_STEP, LEARNING_RATE_DECAY, staircase=True)
-
#定义待优化参数,初值给10
-
w = tf.Variable(tf.constant(5, dtype=tf.float32))
-
#定义损失函数loss
-
loss = tf.square(w+1)
-
#定义反向传播方法
-
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)
-
-
#生成会话,训练40轮
-
with tf.Session() as sess:
-
init_op=tf.global_variables_initializer()
-
sess.run(init_op)
-
for i in range(40):
-
sess.run(train_step)
-
learning_rate_val = sess.run(learning_rate)
-
global_step_val = sess.run(global_step)
-
w_val = sess.run(w)
-
loss_val = sess.run(loss)
-
print "After %s steps: global_step is %f, w is %f, learning rate is %f, loss is %f" % (i, global_step_val, w_val, learning_rate_val, loss_val)
3、正则化
处理过拟合问题
-
#定义神经网络的输入、参数和输出,定义前向传播过程
-
声明一个参数生成函数
-
def get_weight(shape, regularizer):
-
#w = tf.Variable(tf.random_normal(shape), dtype=tf.float32)
-
w = tf.Variable(tf.random_normal(shape,stddev = 1,seed =1), dtype=tf.float32)
-
tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(regularizer)(w))
-
return w
产生一个参数
REGULARIZER = 0.01#复杂度占总损失比列
w1 = get_weight([1,1],REGULARIZER )
.......................
-
loss_mse = tf.reduce_mean(tf.square(y-y_))
-
添加到损失函数上
loss_total = loss_mse + tf.add_n(tf.get_collection('losses'))
#定义反向传播方法:包含正则化
-
train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss_total)
4、滑动平均
每个变量维护一个影子变量。
-
#1. 定义变量及滑动平均类
-
#定义一个32位浮点变量,初始值为0.0 这个代码就是不断更新w1参数,优化w1参数,滑动平均做了个w1的影子
-
w1 = tf.Variable(0, dtype=tf.float32)
-
#定义num_updates(NN的迭代轮数),初始值为0,不可被优化(训练),这个参数不训练
-
global_step = tf.Variable(0, trainable=False)
-
#实例化滑动平均类,给衰减率为0.99,当前轮数global_step
-
MOVING_AVERAGE_DECAY = 0.99
-
ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)
-
#ema.apply后的括号里是更新列表,每次运行sess.run(ema_op)时,对更新列表中的元素求滑动平均值。
-
#在实际应用中会使用tf.trainable_variables()自动将所有待训练的参数汇总为列表
-
#ema_op = ema.apply([w1])
-
ema_op = ema.apply(tf.trainable_variables())
阅读(371206) | 评论(0) | 转发(0) |