欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

dropout学习笔记

程序员文章站 2022-07-13 11:27:19
...
目的:
    防止过拟合,让一部分权值停止更新,减少权值之间的依赖
原理:
    当网络有n个参数时,可以选择的子网络个数有2^n种,当n很大时,选中相同子网络的概率很小,避免了对同一个网络重复训练,过分拟合到训练集

以前我们网络的计算公式是:
 
dropout学习笔记
采用dropout后计算公式就变成了:
 
dropout学习笔记
上面公式中Bernoulli函数,是为了以概率p,随机生成一个0、1的向量

在训练的时候,以一定概率乘以上一层的输出(即本层的输入),这样就相当于停止本次的权值

代码:
#dropout函数的实现
def dropout(x, level):
	if level < 0. or level >= 1:#level是概率值,必须在0~1之间
	    raise Exception('Dropout level must be in interval [0, 1[.')
	retain_prob = 1. - level
    #我们通过binomial函数,生成与x一样的维数向量。binomial函数就像抛硬币一样,我们可以把每个神经元当做抛硬币一样
	#硬币 正面的概率为p,n表示每个神经元试验的次数
	#因为我们每个神经元只需要抛一次就可以了所以n=1,size参数是我们有多少个硬币。
	sample=np.random.binomial(n=1,p=retain_prob,size=x.shape)#即将生成一个0、1分布的向量,0表示这个神经元被屏蔽,不工作了,也就是dropout了
	print sample
	x *=sample#0、1与x相乘,我们就可以屏蔽某些神经元,让它们的值变为0
	print x
	x /= retain_prob

	return x
#对dropout的测试,大家可以跑一下上面的函数,了解一个输入x向量,经过dropout的结果
x=np.asarray([1,2,3,4,5,6,7,8,9,10],dtype=np.float32)
dropout(x,0.4)
打印结果
[1 0 1 1 1 0 1 1 0 1]
[ 1.  0.  3.  4.  5.  0.  7.  8.  0. 10.]

相关标签: 过拟合