dropout学习笔记
程序员文章站
2022-07-13 11:27:19
...
目的:
防止过拟合,让一部分权值停止更新,减少权值之间的依赖
原理:
当网络有n个参数时,可以选择的子网络个数有2^n种,当n很大时,选中相同子网络的概率很小,避免了对同一个网络重复训练,过分拟合到训练集
以前我们网络的计算公式是:
采用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.]
上一篇: KNN(K近邻算法)
下一篇: dropout原理与实现