我是靠谱客的博主 靓丽乌龟,这篇文章主要介绍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的方法。

复制代码
1
2
3
4
5
6
7
8
9
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的整体训练过程:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# -*- 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内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部