1 # coding:utf-8
2 import numpy as np
3
4 # dropout函数的实现
5 def dropout(x, level):
6 if level < 0. or level >= 1: #level是概率值,必须在0~1之间
7 raise ValueError('Dropout level must be in interval [0, 1[.')
8 retain_prob = 1. - level#level是失活的概率
9
10 # 我们通过binomial函数,生成与x一样的维数向量。binomial函数就像抛硬币一样,我们可以把每个神经元当做抛硬币一样
11 # 硬币 正面的概率为p(为1的概率是p,也就是不失活的概率为p),n表示每个神经元试验的次数
12 # 因为我们每个神经元只需要抛一次就可以了所以n=1,size参数是我们有多少个硬币。
13 random_tensor = np.random.binomial(n=1, p=retain_prob, size=x.shape) #即将生成一个0、1分布的向量,0表示这个神经元被屏蔽,不工作了,也就是dropout了
14 print(random_tensor)
15
16 x *= random_tensor
17 print(x)
18 x /= retain_prob#我们要保持预测输出和训练输出基本相同因此要除以不失活的概率
19
20 return x
21
22 #对dropout的测试,大家可以跑一下上面的函数,了解一个输入x向量,经过dropout的结果
23 x=np.asarray([1,2,3,4,5,6,7,8,9,10],dtype=np.float32)
24 dropout(x,0.4)
深度学习中Dropout原理解析 - 知乎 (zhihu.com)