Dropout层
过程
相当于在一个大的网络模型中每次随机小模型,类似在模拟集成学习。
避免过拟合
例如在图示中,通过Dropout层,每次选择网络中的一部分继续计算传递。
实现
可以使用keras Dropout层实现,这里自定义一个方法。
import numpy as np
#X输入 drop_probability丢失的概率
def dropout(X, drop_probability):
keep_probability = 1 - drop_probability
assert 0 <= drop_probability <= 1
if keep_probability == 0:
return X.zeros_like()
sample=np.random.binomial(1,keep_probability,size=X.shape)
X *=sample
#这里除是因为要使得输入矩阵期望保持一致
scale = 1/keep_probability
return X*scale
测试:
A = np.arange(20).reshape((5, 4))
dropout(A, 0.5)
#输出:
#array([[ 0., 0., 0., 6.],
# [ 8., 10., 12., 0.],
# [ 0., 18., 0., 0.],
# [ 0., 26., 28., 0.],
# [32., 34., 36., 38.]])
完整代码
注意点:
通常模型是这么一个过程:
全链接层 -> 激活函数 -> 丢弃层
不过一般情况下将越接近输出层的丢失层概率设置更小一些,可以理解为越接近输出层模型参数更重要。例如:
全链接层 -> 激活函数 -> 丢弃层(0.5) -> 激活函数 -> 丢弃层(0.1)
版权声明:本文为persistinlife原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。