tensorflow-正则化+指数衰减+滑动平均

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Tue Sep 19 09:42:22 2017

@author: myhaspl
"""
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

INPUT_NODE=784
OUTPUT_NODE=10

LAYER1_NODE=500
BATCH_SIZE=100

LEARNING_RATE_BASE=0.8
LEARNING_RATE_DECAY=0.99

REGULARIZATION_RATE=0.0001
TRANING_STEPS=30000
MOVING_AVERAGE_DECAY=0.99

def inference(input_tensor,avg_class,weights1, biases1,weights2,biases2):
if avg_class==None:#非滑动平均
layer1=tf.nn.relu(tf.matmul(input_tensor,weights1)+biases1)
return tf.matmul(layer1,weights2)+biases2
else:#滑动平均
layer1=tf.nn.relu(tf.matmul(input_tensor,avg_class.average(weights1))+avg_class.average(biases1))
return tf.matmul(layer1,avg_class.average(weights2))+avg_class.average(biases2)

def train(mnist):
#样本数据与样本标签
x_=tf.placeholder(tf.float32,[None,INPUT_NODE],name=‘x_-input‘)
y_=tf.placeholder(tf.float32,[None,OUTPUT_NODE],name=‘y_-input‘)
#参数初始值
weights1=tf.Variable(tf.truncated_normal([INPUT_NODE,LAYER1_NODE],stddev=0.1))
biases1=tf.Variable(tf.constant(0.1,shape=[LAYER1_NODE]))
weights2=tf.Variable(tf.truncated_normal([LAYER1_NODE,OUTPUT_NODE],stddev=0.1))
biases2=tf.Variable(tf.constant(0.1,shape=[OUTPUT_NODE]))
global_step=tf.Variable(0,trainable=False)

#非滑动平均
y_nohd=inference(x_,None,weights1,biases1,weights2,biases2)

#滑动平均
variable_averages=tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)
#滑动平均更新变量的操作
variable_averages_op=variable_averages.apply(tf.trainable_variables())
y_hd=inference(x_,variable_averages,weights1,biases1,weights2,biases2)

#交叉嫡损失函数,使用softmax归一化
cross_entropy=tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y_nohd,labels=tf.arg_max(y_,1))
cross_entropy_mean=tf.reduce_mean(cross_entropy)
#加入L2正则化损失
regularizer=tf.contrib.layers.l2_regularizer(REGULARIZATION_RATE)
regularization=regularizer(weights1)+regularizer(weights2)
loss=cross_entropy_mean+regularization

#设置指数衰减的学习率
learning_rate=tf.train.exponential_decay(
LEARNING_RATE_BASE,
global_step,
mnist.train.num_examples/BATCH_SIZE,
LEARNING_RATE_DECAY)

train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=global_step)
#训练与更新参数的滑动平均值
#将2大步操作打包在train_op中,第1大步操作是使用正则化和指数衰减更新参数值
#第2大步操作是使用滑动平均再次更新参数值。
#每次训练都完成这2大步操作。
train_op=tf.group(train_step,variable_averages_op)
#检验滑动平均平均模型的神经网络前向传播结果是否正确
correct_predection=tf.equal(tf.argmax(y_hd,1),tf.argmax(y_,1))
accuracy=tf.reduce_mean(tf.cast(correct_predection,tf.float32))

#开始训练过程
with tf.Session() as sess:
tf.initialize_all_variables().run()
#训练样本集
validate_feed={x_:mnist.validation.images,
y_:mnist.validation.labels
}
#测试集
test_feed={x_:mnist.test.images,
y_:mnist.test.labels
}
for i in range(TRANING_STEPS):
if i%1000==0:
#每1000轮计算当前训练的结果
validate_acc=sess.run(accuracy,feed_dict=validate_feed)
print("%d次后=>正确率%g"%(i,validate_acc))
#每一轮使用的样本,然后开始训练
xs,ys=mnist.train.next_batch(BATCH_SIZE)
sess.run(train_op,feed_dict={x_:xs,y_:ys})

#TRANING_STEPS次训练结束,对测试数据进行检测,检验神经网络准确度
test_acc=sess.run(accuracy,feed_dict=test_feed)
print("正确率:%g"%test_acc)

def main(argv=None):
mnist=input_data.read_data_sets("/tmp/data",one_hot=True)
train(mnist)

if __name__==‘__main__‘:
tf.app.run()

使用了非线性激活函数relu,防止梯度消失。

原文地址:http://blog.51cto.com/13959448/2330909

时间: 2024-11-13 02:13:30

tensorflow-正则化+指数衰减+滑动平均的相关文章

78、tensorflow滑动平均模型,用来更新迭代的衰减系数

''' Created on 2017年4月21日 @author: weizhen ''' #4.滑动平均模型 import tensorflow as tf #定义一个变量用于计算滑动平均,这个变量的初始值为0. #类型为tf.float32,因为所有需要计算滑动平均的变量必须是实数型 v1=tf.Variable(0,dtype=tf.float32) #这里step变量模拟神经网络中迭代的轮数,可以用于动态控制衰减率 step=tf.Variable(0,trainable=False)

Tensorflow实现学习率衰减

Tensorflow实现学习率衰减 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 Deeplearning AI Andrew Ng Tensorflow1.2 API 学习率衰减(learning rate decay) 加快学习算法的一个办法就是随时间慢慢减少学习率,我们将之称为学习率衰减(learning rate decay) 概括 假设你要使用mini-batch梯度下降法,mini-batch数量不大,大概64或者128个样本,但是在迭代过程中会有噪音,下降朝向这

指数衰减学习率

#coding:utf-8 #设损失函数 loss=(w+1)^2,令w初值是常数10.反向传播就是求最优w,即求最小loss对应的w值 #使用指数衰减学习率,在迭代初期得到较高的下降速度,可以在较小的训练轮数下取得更有效收敛度 import tensorflow as tf LEARNING_RATE_BASE = 0.1 #最初学习率 LEARNING_RATE_DECAY = 0.99 #学习率衰减率 LEARNING_RATE_STEP = 1 #喂入多少轮BATCH_SIZE后,更新一

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

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

滑动平均滤波算法(递推平均滤波法)

//滑动平均滤波算法(递推平均滤波法) //ADNum为获得的AD数 //GN为数组value_buf[]的元素个数.该函数主要被调用,利用参数的数组传值 const int GN = 12; int filterPtr = 0; bool isFirst = true; public float gSum = 0; float[] gbuf  = new float[GN]; float GlideFilterAD(float ADNum) { if (isFirst) { isFirst =

求滑动平均

臭氧的滑动平均 select FID,version,fsiteid,fDATETIME, case when (count(fO3) OVER (partition by fsiteid order by fDATETIME RANGE interval '7' hour preceding ))>5 then (avg(fO3) OVER (partition by fsiteid order by fDATETIME RANGE interval '7' hour preceding ))

滑动平均滤波算法(递推平均滤波法)(转帖)

//滑动平均滤波算法(递推平均滤波法)--C语言版 int FilterI=0; //ADNum为获得的AD数 //n为数组value_buf[]的元素个数.该函数主要被调用,利用参数的数组传值 int GlideFilterAD(int value_buf[],int n,int ADNum) { int sum=0; value_buf[FilterI++]=ADNum; if(FilterI==n) FilterI=0; //先进先出,再求平均值 for(int count=0;count

训练模型之loss曲线滑动平均

- 只依赖python def print_loss(config, title, loss_dict, epoch, iters, current_iter, need_plot=False): data_str = '' for k, v in loss_dict.items(): if data_str != '': data_str += ', ' data_str += '{}: {:.10f}'.format(k, v) if need_plot and config.vis is

MATLAB 利用filter函数实现滑动平均滤波

function [ y ] = moving_average( x, win_size ) y1=filter(ones(1,win_size/2+1)/win_size,1,x); y2=filter(ones(1,win_size/2+1)/win_size,1,fliplr(x)); y=y1+fliplr(y2)-(1/win_size)*x; end L = win_size/2; yi = (1/win_size)∑(j=i-L:i+L)xj