tensorflow笔记03

tensorflow笔记03:神经网络的正则化

在学习路上不断前进!!!

1.正则化

1.1为什么要正则化

在介绍正则化前,我们必须先知道什么是过拟合,简单来说,过拟合就是模型在训练集上表现得太完美,以至于“过了”如图:
在这里插入图片描述
在这里插入图片描述
x1:欠拟合。
x2:刚刚好。
x3:过拟合,我们面临一些分类,是无法做到这么精准的

过拟合说明了模型不够通用,如果将模型用于新的数据上,即得到的效果比在训练集上差很多
造成过拟合的现象原因是:1.数据少;2.算法不够好;3.模型过于复杂(重要原因)
一般来说,模型复杂度与测试误差构成一个U型图,
在这里插入图片描述
在这里插入图片描述
从图我们可以得知:模型复杂度并不是越大越好,训练精度随模型复杂度逐渐变小(奥卡姆剃刀原则),必须选择恰当的模型复杂度,使得模型误差减小。
如何解决过拟合问题呢?——正则化是有效方法之一,它可以有效减少高偏差还能降低偏差。

1.2正则化概念

首先,在机器学习中,很多被显式的用来减少测试误差的手段,统称为正则化。正则化旨在减少泛化误差而不是训练误差。传统的的正则化手段(策略)分:L1,L2,L3…L…常用L1,L2正则化
上面有介绍到,模型出现过拟合,是在模型特征上过于复杂。而特征又包含在我们的目标函数f(x)之中,那么只能从目标函数f(x)中寻找解决问题的方法。假设目标函数f(x)和损失函数Jo为
在这里插入图片描述
如果特征项x0 ,x 1 ,x 2 ,…,x n 越多的话,自然w0,w1,w2,…w n也越多,想要减少特征的数量,自然减小N也就好了。而N影响的是​X=(x0 ,x 1 ,x 2 ,…,x n )和W=(W0 ,W 1 ,W 2 ,…,W n )两项,那么是从X解决问题还是从W解决问题呢?如果从X入手解决问题,但训练过程中我们不知道下一个样本X是什么,会怎样的影响目标函数,所以此路不通。那么W如何呢?我们知道W系数是训练过程中通过学习历史数据得到的,和历史数据有关,所以应该可以。现在再回到我们原来的问题,希望减少N的数目,而让N最小化,其实就是让X向量或W向量中项的个数最小化,既然X不行,那么我们可以尝试让W向量中项的个数最小化。
让权重W最小化通常使用L1,L2范数惩罚项
在这里插入图片描述

例子演示

例子
例如:
用 300 个符合正态分布的点 X[x 0 , x 1 ]作为数据集,根据点 X[x 0 , x 1 ]计算生成标注 Y_,将数据集
标注为红色点和蓝色点。
标注规则为:当 x 02 + x 12 < 2 时,y_=1,标注为红色;当 x 02 + x 12 ≥2 时,y_=0,标注为蓝色。
我们分别用无正则化和有正则化两种方法,拟合曲线,把红色点和蓝色点分开。在实际分类时,
如果前向传播输出的预测值 y 接近 1 则为红色点概率越大,接近 0 则为蓝色点概率越大,输出的预
测值 y 为 0.5 是红蓝点概率分界线。

1.正则化方式:正则化:在损失函数中给每个参数 w 加上权重,引入模型复杂度指标,从而抑制模型噪声,减小过拟合。使用正则化后,损失函数 loss 变为两项之和:
loss = loss(y 与 y_) + REGULARIZER*loss(w)
其中,第一项是预测结果与标准答案之间的差距,如之前讲过的交叉熵、均方误差等;第二项是正则
化计算结果。

代码

# coding:utf-8
#神经网络之正则化。
import tensorflow as tf
import numpy as np

#例子:用300个符合正态分布的点进行分类实验。检验有正则化与无正则化的拟合效果
#:其中,标注规则是当x0**2+x1**2<2是红色,反之则是蓝色
"""
在实际分类时,
如果前向传播输出的预测值 y 接近 1 则为红色点概率越大,
接近 0 则为蓝色点概率越大,输出的预测值 y 为 0.5 是红蓝点概率分界线。
"""

#使用matplotlib模块可视化

import matplotlib.pyplot as plt

#设置喂入的数据的大小及随机种子
BATCH_SIZE = 30
SEED = 2

#基于随机种子设置随机数
rand = np.random.RandomState(SEED)

#创建300×2的矩阵做数据集(正态分布),表示300个点(x0,x1)
X = rand.randn(300,2)
#创建Y数据集
Y_ = [int(x0*x0+x1*x1<2) for (x0,x1) in X]
 

#遍历元素,使得=1的点是赋值是红色,其余的点是蓝色,进行可视化区分
Y_c = [['red' if y else 'blue'] for y in Y_]

#对数据集进行shape处理,第一个元素是-1,表示自动计算行数,随第二个参数计算得到,第二个元素,把x整理为n行2列,把y整理为n行1列

X = np.vstack(X).reshape(-1,2)
Y_ = np.vstack(Y_).reshape(-1,1)

print X
print Y_
print Y_c


#用plt.scatter 画出数据集X各行中的第一列元素与第二列的元素的点(x0,x1),并根据Y_c表示出对应的点的颜色

plt.scatter(X[:,0],X[:,1],c=np.squeeze(Y_c))
#展示图片
plt.show()
#定义神经网络的输入,参数,及输出,同时定义前向传播过程

#1.权重
def get_weight(shape,regularizer):
	w = tf.Variable(tf.random_normal(shape),dtype=tf.float32)
	#使用正则化方式
	tf.add_to_collection('losses',tf.contrib.layers.l2_regularizer(regularizer)(w))
	return w
#2.偏置
def get_bias(shape):
	b = tf.Variable(tf.constant(0,01,shape=shape))
	return b

#输入x,y
x = tf.placeholder(tf.float32,shape=(None,2))
y_ = tf.placeholder(tf.float32,shape=(None,1))

#获取权重w,偏置b
w1 = get_weight([2,11],0.01)
b1 = get_bias([11])
#设置激活函数
y1 = tf.nn.relu(tf.matmul(x,w1)+b1)

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


#定义损失函数
#使用均方误差
loss_mse = tf.reduce_mean(tf.square(y-y_))
loss_total = loss_mse+tf.add_n(tf.get_collection('losses'))

#定义反向传播,不含正则化
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 #数据集x的行数
		end = start+ BATCH_SIZE
		#开始训练
		sess.run(train_step,feed_dict={x:X[start:end],y_:Y_[start:end]})
		
		if i%2000==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在-3到3之间以步长为0.01生成二维网格坐标点
	xx,yy = np.mgrid[-3:3:0.01,-3:3:0.01]
	#将网格拉直并合并成一个二维网格坐标点集合
	grid = np.c_[xx.ravel(),yy.ravel()]
	#将网格喂入神经网络。pros为输出
	probs = sess.run(y,feed_dict={x:grid})
	#pros的shape整理成xx的样子
	probs = probs.reshape(xx.shape)
	#打印权重,偏置
	print "w1:\n:",sess.run(w1)
	print "b1:\n:",sess.run(b1)
	print "w2:\n:",sess.run(w2)
#可视化展示
plt.scatter(X[:,0],X[:,1],c=np.squeeze(Y_c))
plt.contour(xx,yy,probs,levels=[.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%2000==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)

	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])
plt.show()

产生的数据图:
在这里插入图片描述

未使用正则化,训练网络得到的模型的分类效果演示:
在这里插入图片描述
使用了正则化手段后模型的分类效果演示:
在这里插入图片描述
上面两张图片可以看出正则化后的泛化误差更低,模型分类的效果更加真实。

正则化策略类型

未完待更。。。

–参考博客:https://blog.csdn.net/xiaoyi_eric/article/details/80909492

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨夜※繁华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值