Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4240924
  • 博文数量: 473
  • 博客积分: 12019
  • 博客等级: 上将
  • 技术积分: 6515
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-01 16:46
文章分类

全部博文(473)

文章存档

2020年(30)

2019年(4)

2018年(10)

2017年(5)

2016年(2)

2015年(4)

2014年(4)

2013年(16)

2012年(47)

2011年(65)

2010年(46)

2009年(34)

2008年(52)

2007年(52)

2006年(80)

2005年(22)

分类: Python/Ruby

2020-04-12 20:24:03

1、反向传播
在所有参数上使用梯度下降,从而使模型在训练集合上损失函数尽量少
常见函数  tf.train.GradientDescentOptimizer

模型优化标准通过损失函数完成
a、回归问题,输出为某个数值,采用MSE 均方差(mean squared error)
b、分类问题    交叉商(cross entropy)
c、自定义损失函数

2、学习率
学习率控制参数更新速度。一般使用指数衰减的学习率,在迭代初期得到较高的下降速度,可以在较小的训练轮数下取得更有收敛度。

注意黄色部分

点击(此处)折叠或打开

  1. import tensorflow as tf

  2. LEARNING_RATE_BASE = 0.1 #最初学习率
  3. LEARNING_RATE_DECAY = 0.99 #学习率衰减率
  4. LEARNING_RATE_STEP = 1 #喂入多少轮BATCH_SIZE后,更新一次学习率,一般设为:总样本数/BATCH_SIZE

  5. #运行了几轮BATCH_SIZE的计数器,初值给0, 设为不被训练
  6. global_step = tf.Variable(0, trainable=False)
  7. #定义指数下降学习率
  8. learning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE, global_step, LEARNING_RATE_STEP, LEARNING_RATE_DECAY, staircase=True)
  9. #定义待优化参数,初值给10
  10. w = tf.Variable(tf.constant(5, dtype=tf.float32))
  11. #定义损失函数loss
  12. loss = tf.square(w+1)
  13. #定义反向传播方法
  14. train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)

  15. #生成会话,训练40轮
  16. with tf.Session() as sess:
  17.     init_op=tf.global_variables_initializer()
  18.     sess.run(init_op)
  19.     for i in range(40):
  20.         sess.run(train_step)
  21.         learning_rate_val = sess.run(learning_rate)
  22.         global_step_val = sess.run(global_step)
  23.         w_val = sess.run(w)
  24.         loss_val = sess.run(loss)
  25.         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、正则化
处理过拟合问题


点击(此处)折叠或打开

  1. #定义神经网络的输入、参数和输出,定义前向传播过程
  2. 声明一个参数生成函数
  3. def get_weight(shape, regularizer):
  4.     #w = tf.Variable(tf.random_normal(shape), dtype=tf.float32)
  5.     w = tf.Variable(tf.random_normal(shape,stddev = 1,seed =1), dtype=tf.float32)
  6.     tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(regularizer)(w))
  7.     return w

    产生一个参数
    REGULARIZER = 0.01#复杂度占总损失比列
    w1 = get_weight([1,1],REGULARIZER )
 .......................
  1. loss_mse = tf.reduce_mean(tf.square(y-y_))
  2. 添加到损失函数上
    loss_total = loss_mse + tf.add_n(tf.get_collection('losses'))

    #定义反向传播方法:包含正则化

  3. train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss_total)





4、滑动平均

每个变量维护一个影子变量。

点击(此处)折叠或打开

  1. #1. 定义变量及滑动平均类
  2. #定义一个32位浮点变量,初始值为0.0 这个代码就是不断更新w1参数,优化w1参数,滑动平均做了个w1的影子
  3. w1 = tf.Variable(0, dtype=tf.float32)
  4. #定义num_updates(NN的迭代轮数),初始值为0,不可被优化(训练),这个参数不训练
  5. global_step = tf.Variable(0, trainable=False)
  6. #实例化滑动平均类,给衰减率为0.99,当前轮数global_step
  7. MOVING_AVERAGE_DECAY = 0.99
  8. ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)
  9. #ema.apply后的括号里是更新列表,每次运行sess.run(ema_op)时,对更新列表中的元素求滑动平均值。
  10. #在实际应用中会使用tf.trainable_variables()自动将所有待训练的参数汇总为列表
  11. #ema_op = ema.apply([w1])
  12. ema_op = ema.apply(tf.trainable_variables())









阅读(149550) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~