我是靠谱客的博主 靓丽乌龟,最近开发中收集的这篇文章主要介绍Tensorflow 在损失函数中加入正则项(Normalization),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

L1和L2正则:

举例说明,假设有一个数组 nums=[1,2,3,4]

L1 = a*(|1|+|2|+|3|+|4|)

L2 = a*(1^2+2^2+3^2+4^2)/2

其中a是系数,用于平衡正则项与经验损失函数的权重关系,即:C = loss+a*Normalization。

这里说明一下,利用L1经过训练后,会让权重得到稀疏结,即权重中的一部分项为0,这种作用相当于对原始数据进行了特征选择;利用L2进行训练后,会让权重更趋于0,但不会得到稀疏解,这样做可以避免某些权重过大;两种正则做法都可以减轻过拟合,使训练结果更加具有鲁棒性。

下面给出使用TensorFlow计算L1,L2的方法。

import tensorflow as tf
alpha = 0.5 #系数设置为0.5,alpha相当于上述a
val = tf.constant([[1,2],[3,4]],dtype=tf.float32)
l1 = tf.contrib.layers.l1_regularizer(alpha)(val)
l2 = tf.contrib.layers.l2_regularizer(alpha)(val)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print ("l1:",sess.run(l1))
print ("l2:",sess.run(l2))

下面给出使用TensorFlow的整体训练过程:

# -*- coding: utf-8 -*-
"""
Created on Sun Jun
4 21:51:33 2017
@author: Yangyang Deng
@Email: yangydeng@163.com
"""
import tensorflow as tf
from numpy.random import RandomState
w1 = tf.Variable(tf.truncated_normal([2,3],seed=1))
w2 = tf.Variable(tf.truncated_normal([3,1],seed=1))
x = tf.placeholder(dtype=tf.float32,shape=[None,2])
y_real = tf.placeholder(dtype=tf.float32,shape=[None,1])
a = tf.nn.relu(tf.matmul(x,w1))
#神经元的激活函数为 relu
y_pre = tf.nn.relu(tf.matmul(a,w2))
sample_size = 20000 #训练样本总数
batch = 500 # 使用mini-batch(批梯度下降),每个batch的大小。
rds = RandomState(0)
X = rds.rand(sample_size,2)
Y = [[int(20*x1+30*x2)]+rds.rand(1) for (x1,x2) in X] #Y = 20*x1+30*x2+noise
global_step = tf.Variable(0)
#--------------学习速率的设置(学习速率呈指数下降)---------------------
learning_rate = tf.train.exponential_decay(1e-2,global_step,decay_steps=sample_size/batch,decay_rate=0.98,staircase=True)
#-------------使用均方误差(MSE)作为损失函数,在损失函数中加入L1正则项
MSE = tf.reduce_mean(tf.square(y_real-y_pre)+tf.contrib.layers.l1_regularizer(0.1)(w1))
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(MSE,global_step=global_step)
step = 20000 #训练的总次数
start = 0
end = batch
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(step):
sess.run(train_step,feed_dict={x:X[start:end],y_real:Y[start:end]})
if not i%20:
H = sess.run(MSE,feed_dict={x:X[start:end],y_real:Y[start:end]})
lr = sess.run(learning_rate)
l1 = sess.run(tf.contrib.layers.l1_regularizer(0.1)(w1))
print ("MSE: ",H,"
learning_rate: ",lr," l1:",l1)
if H<1e-1:
#采用stop early 的方法防止过拟合,节省训练时间。
break
strat = end if end<sample_size else 0
end = start+batch
y1 = sess.run(y_pre,feed_dict={x:X[start:end]})
y2 = Y[start:end]
sess.close()
#训练结果的部分展示
for i in range(100):
print(y1[i],y2[i])




最后

以上就是靓丽乌龟为你收集整理的Tensorflow 在损失函数中加入正则项(Normalization)的全部内容,希望文章能够帮你解决Tensorflow 在损失函数中加入正则项(Normalization)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部