dropout的思想和目的这里就不赘述了。
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)
print('before dropout:', x, x.sum())
x *= sample # 0、1与x相乘,我们就可以屏蔽某些神经元,让它们的值变为0
x /= retain_prob
print('after dropout', x, x.sum())
return x
x = np.asarray([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=np.float32)
x/= x.max()
dropout(x, 0.4)