tensorflow(3):神经网络优化(ema,regularization)

1.指数滑动平均 (ema)

描述滑动平均:

with tf.control_dependencies([train_step,ema_op]) 将计算滑动平均与 训练过程绑在一起运行

train_op=tf.no_op(name=‘train‘)  使它们合成一个训练节点

#定义变量一级滑动平均类
#定义一个32位浮点变量,初始值为0.0, 这个代码就是在不断更新w1参数,优化 w1,滑动平均做了一个w1的影子
w1=tf.Variable(0,dtype=tf.float32)
#定义num_updates(NN 的迭代次数)初始值为0, global_step不可被优化(训练) 这个额参数不训练
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_variable()自动将所有待训练的参数汇总为列表
#ema_op=ema.apply([w1])
ema_op=ema.apply(tf.trainable_variables())

#查看不同迭代中变量的取值变化
with tf.Session() as sess:
    init_op=tf.global_variables_initializer()
    sess.run(init_op)
    #ema_op=ema.apply([w1])获取w1 的滑动平均值,
    print(sess.run([w1,ema.average(w1)])) #打印当前参数w1和w1 的滑动平均值 (0,0)
    sess.run(tf.assign(w1,1))
    sess.run(ema_op)
    print(sess.run([w1,ema.average(w1)])) #(1,0.9)
    #跟新step w1的值,模拟出100轮迭代后,参数w1 变为10
    sess.run(tf.assign(global_step,100))
    sess.run(tf.assign(w1,10))
    sess.run(ema_op)
    print(sess.run([w1,ema.average(w1)])) #(10,1.644)

    #每次sess.run会更新一次w1的滑动平均值
    sess.run(ema_op)
    print(sess.run([w1,ema.average(w1)]))
    sess.run(ema_op)
    print(sess.run([w1,ema.average(w1)]))
    sess.run(ema_op)
    print(sess.run([w1,ema.average(w1)]))
    sess.run(ema_op)
    print(sess.run([w1,ema.average(w1)]))
    sess.run(ema_op)
    print(sess.run([w1,ema.average(w1)]))

结果:

[0.0, 0.0]
[1.0, 0.9]
[10.0, 1.6445453]
[10.0, 2.3281732]
[10.0, 2.955868]
[10.0, 3.532206]
[10.0, 4.061389]
[10.0, 4.547275]

w1的移动平均会越来越趋近于w1 ...

2.正则化regularization

有时候模型对训练集的正确率很高, 却对新数据很难做出正确的相应, 这个叫过拟合现象.

加入噪声后,loss变成了两个部分,前者是以前讲过的普通loss,

后者的loss(w)有两种求法,分别称为L1正则化与 L2正则化

以下举例说明:

代码:

atch_size=30
#建立数据集
seed=2
rdm=np.random.RandomState(seed)
X=rdm.randn(300,2)
Y_=[int(x0*x0+x1*x1<2) for (x0,x1) in X]
Y_c=[[‘red‘ if y else ‘blue‘] for y in Y_] #1则红色,0则蓝色
X=np.vstack(X).reshape(-1,2) #整理为n行2列,按行的顺序来
Y_=np.vstack(Y_).reshape(-1,1)# 整理为n行1列
#print(X)
#print(Y_)
#print(Y_c)
plt.scatter(X[:,0],X[:,1],c=np.squeeze(Y_c))#np.squeeze(Y_c)变成一个list
plt.show()
#print(np.squeeze(Y_c))

#定义神经网络的输入 输出 参数, 定义前向传播过程
def get_weight(shape,regularizer): #w的shape 和w的权重
    w=tf.Variable(tf.random_normal(shape),dtype=tf.float32)
    tf.add_to_collection(‘losses‘,tf.contrib.layers.l2_regularizer(regularizer)(w))
    return w

def get_bias(shape): #b的长度
    b=tf.Variable(tf.constant(0.01,shape=shape))
    return b
#
x=tf.placeholder(tf.float32,shape=(None,2))
y_=tf.placeholder(tf.float32,shape=(None,1))
w1=get_weight([2,11],0.01)
b1=get_bias([11])
y1=tf.nn.relu(tf.matmul(x,w1)+b1) #relu 激活函数

w2=get_weight([11,1],0.01)
b2=get_bias([1])
y=tf.matmul(y1,w2)+b2  #输出层不过激活函数

#定义损失函数loss
loss_mse=tf.reduce_mean(tf.square(y-y_))
loss_total=loss_mse+tf.add_n(tf.get_collection(‘losses‘))

#定义反向传播方法, 不含正则化, 要是使用正则化,则 为loss_total
train_step=tf.train.AdamOptimizer(0.0001).minimize(loss_mse)
with tf.Session() as sess:
    init_op=tf.global_variables_initializer()
    sess.run(init_op)
    steps=40000
    for i in range(steps):
        start=(i*batch_size)%300
        end=start+batch_size
        sess.run(train_step,feed_dict={x:X[start:end],y_:Y_[start:end]})
        if i%10000==0:
            loss_mse_v=sess.run(loss_mse,feed_dict={x:X,y_:Y_})
            print(‘after %d steps,loss is:%f‘%(i,loss_mse_v))
    xx,yy=np.mgrid[-3:3:0.01,-3:3:0.01]
    grid=np.c_[xx.ravel(),yy.ravel()]
    probs=sess.run(y,feed_dict={x:grid})
    probs=probs.reshape(xx.shape) #调整成xx的样子
    print(‘w1:\n‘,sess.run(w1))
    print(‘b1:\n‘,sess.run(b1))
    print(‘w2:\n‘,sess.run(w2))
    print(‘b2:\n‘,sess.run(b2))
plt.scatter(X[:,0],X[:,1],c=np.squeeze(Y_c))
plt.contour(xx,yy,probs,levels=[.5]) #给probs=0.5的值上色 (显示分界线)
plt.show()

#使用个正则化
train_step=tf.train.AdamOptimizer(0.0001).minimize(loss_total)
with tf.Session() as sess:
    init_op=tf.global_variables_initializer()
    sess.run(init_op)
    steps=40000
    for i in range(steps):
        start=(i*batch_size)%300
        end=start+batch_size
        sess.run(train_step,feed_dict={x:X[start:end],y_:Y_[start:end]})
        if i%10000==0:
            loss_v=sess.run(loss_total,feed_dict={x:X,y_:Y_})
            print(‘after %d steps,loss is:%f‘%(i,loss_v))
    xx,yy=np.mgrid[-3:3:0.01,-3:3:0.01]
    grid=np.c_[xx.ravel(),yy.ravel()]
    probs=sess.run(y,feed_dict={x:grid})
    probs=probs.reshape(xx.shape) #调整成xx的样子
    print(‘w1:\n‘,sess.run(w1))
    print(‘b1:\n‘,sess.run(b1))
    print(‘w2:\n‘,sess.run(w2))
    print(‘b2:\n‘,sess.run(b2))
plt.scatter(X[:,0],X[:,1],c=np.squeeze(Y_c))
plt.contour(xx,yy,probs,levels=[.5]) #给probs=0.5的值上色
plt.show()

结果显示:

显然 经过正则化,分割线更加平滑,数据集中的噪声对模型的影响更小,

原文地址:https://www.cnblogs.com/xuying-fall/p/8971983.html

时间: 2024-10-12 06:20:30

tensorflow(3):神经网络优化(ema,regularization)的相关文章

tensorflow(2):神经网络优化(loss,learning_rate)

案例: 预测酸奶的日销量, 由此可以准备产量, 使得损失小(利润大),假设销量是y , 影响销量的有两个因素x1, x2, 需要预先采集数据,每日的x1,x2和销量y_, 拟造数据集X,Y_, 假设y_=x1+x2,为了更真实加一个噪声(-0.05-0.05) batch_size=8 #一次喂给神经网络多少数据 seed=23455 #构造数据集 rdm=np.random.RandomState(seed) #基于seed产生随机数 X=rdm.rand(32,2) #32组数据 Y_=[[

【零基础】神经网络优化之Adam

一.序言 Adam是神经网络优化的另一种方法,有点类似上一篇中的“动量梯度下降”,实际上是先提出了RMSprop(类似动量梯度下降的优化算法),而后结合RMSprop和动量梯度下降整出了Adam,所以这里我们先由动量梯度下降引申出RMSprop,最后再介绍Adam.不过,由于RMSprop.Adam什么的,真的太难理解了,我就只说实现不说原理了. 二.RMSprop 先回顾一下动量梯度下降中的“指数加权平均”公式: vDW1 = beta*vDW0 + (1-beta)*dw1 vDb1 = b

tensorflow:实战Google深度学习框架第四章02神经网络优化(学习率,避免过拟合,滑动平均模型)

1.学习率的设置既不能太小,又不能太大,解决方法:使用指数衰减法 例如: 假设我们要最小化函数 y=x2y=x2, 选择初始点 x0=5x0=5 1. 学习率为1的时候,x在5和-5之间震荡. import tensorflow as tf TRAINING_STEPS = 10 LEARNING_RATE = 1 x = tf.Variable(tf.constant(5, dtype=tf.float32), name="x") y = tf.square(x) train_op

使用Tensorflow训练神经网络模型

最近正在入坑机器学习,前期以读代码为主.买了一本才云科技郑泽宇的书,叫做<Tensorflow,实战Google深度学习框架>,觉得很适合入门的小菜鸟,拿出来跟大家分享下. 下面是第一个完整的训练神经网络模型的代码,里面综合了作者和我在网上查到的其他人关于代码的解读.整理之后如下: 1 #-*-coding:UTF-8-*- 2 import tensorflow as tf 3 #通过numpy工具包生成模拟数据集 4 from numpy.random import RandomState

神经网络优化(二) - 滑动平均

1 滑动平均概述 滑动平均(也称为 影子值 ):记录了每一个参数一段时间内过往值的平均,增加了模型的泛化性. 滑动平均通常针对所有参数进行优化:W 和 b, 简单地理解,滑动平均像是给参数加了一个影子,参数变化,影子缓慢追随. 滑动平均的表示公式为 影子 = 衰减率 * 影子 + ( 1 - 衰减率 ) * 参数 或 滑动平均值 = 衰减率 * 滑动平均值 + ( 1 - 衰减率 )* 参数 备注 影子初值 = 参数初值 衰减率 = min{ MOVING_AVERAGE_DECAY, (1+轮

神经网络优化(二) - 搭建神经网络八股

为提高程序的可复用性,搭建模块化的神经网络八股 1 前向传播 前向传播就是设计.搭建从输入(参数 x ) 到输出(返回值为预测或分类结果 y )的完整网络结构,实现前向传播过程,一般将其放在 forward.py 文件中 前向传播需要定义三个函数(实际上第一个函数是框架,第二.三个函数是赋初值过程) def forward(x, regularizer): w = b = y = return y 函数功能: 定义前向传播过程,返回值为y 完成网络结构的设计,实现从输入到输出的数据通路 regu

利用Tensorflow实现神经网络模型

首先看一下神经网络模型,一个比较简单的两层神经. 代码如下: # 定义参数 n_hidden_1 = 256 #第一层神经元 n_hidden_2 = 128 #第二层神经元 n_input = 784 #输入大小,28*28的一个灰度图,彩图没有什么意义 n_classes = 10 #结果是要得到一个几分类的任务 # 输入和输出 x = tf.placeholder("float", [None, n_input]) y = tf.placeholder("float&q

人工智能实践:神经网络优化

损失函数 神经元模型:用数学公式表示为:,f为激活函数. 神经网络:是以神经元为基本单元构成的. 激活函数:引入非线性激活因素,提高模型的表达力. 常用的激活函数有relu.sigmoid.tanh等. ① 激活函数relu: 在Tensorflow中,用tf.nn.relu()表示        relu()数学表达式                      relu()数学图形 ② 激活函数sigmoid:在Tensorflow中,用tf.nn.sigmoid()表示           

神经网络优化(二) - 学习率

1 学习率的基本定义 学习率learning_rate:每次参数更新的幅度. 简单示例: 假设损失函数 loss = ( w + 1 )2,则梯度为 参数 w 初始化为 5 ,学习率为 0.2 ,则 运行次数 参数w值 计算 1次 5 5-0.2*(2*5+2) = 2.6 2次 2.6 2.6-0.2*(2*2.6+2) = 1.16 3次 1.16 1.16-0.2*(2*1.16+2) = 0.296 4次 0.296   2 学习率的初步应用 2.1  学习率 0.2 时 # 已知损失函