概述
【Task5(2天)】PyTorch实现L1,L2正则化以及Dropout
1.了解知道Dropout原理,参考https://blog.csdn.net/program_developer/article/details/80737724
https://blog.csdn.net/qunnie_yi/article/details/80128463
训练深度神经网络的时候,总是会遇到两大缺点:
(1)容易过拟合
(2)费时
Dropout可以比较有效的缓解过拟合的发生,在一定程度上达到正则化的效果。
dropout是一种防止模型过拟合的技术,这项技术也很简单,但是很实用。它的基本思想是在训练的时候随机的dropout(丢弃)一些神经元的激活,这样可以让模型更鲁棒,因为它不会太依赖某些局部的特征(因为局部特征有可能被丢弃)。
上图a是标准的一个全连接的神经网络,b是对a应用了dropout的结果,它会以一定的概率(dropout probability)随机的丢弃掉一些神经元
2.用代码实现正则化(L1、L2、Dropout)
L1、L2正则化:https://blog.csdn.net/red_stone1/article/details/80755144
L2 正则化公式非常简单,直接在原来的损失函数基础上加上权重参数的平方和:
L1 正则化公式也很简单,直接在原来的损失函数基础上加上权重参数的绝对值:
#L2
for param in net.parameters():
regularization_loss += torch.sum((param**2))
classify_loss = criterion(outputs, labels)
loss = classify_loss + 0.01regularization_loss
#L1
for param in net.parameters():
regularization_loss += torch.sum(torch.abs(param))
classify_loss = criterion(outputs, labels)
loss = classify_loss + 0.01regularization_loss
3.Dropout的numpy实现
def forward_propagetion_with_dropout(x, paramters, keep_prod=0.7):
# 取出参数
w1 = parameters[‘w1’]
b1 = parameters[‘b1’]
w2 = parameters[‘w2’]
b2 = parameters[‘b2’]
# 向前传播
z1 = np.matmul(w1, x) + b1
a1 = np.tanh(z1)
# 这里加入mask,使得其中一些神经元的活动变为0,在反向传播中,不再更新这些节点
mask1 = (np.random.rand(a1.shape[0], 1) < keep_prod)
a1 = a1 * mask1
a1 = a1 / keep_prod
z2 = np.matmul(w2, a1) + b2
a2 = sigmoid(z2)
a2 = sigmoid(z2)
cache = {
"z1": z1,
"a1": a1,
"mask1": mask1,
"z2": z2,
"a2": a2
}
return a2, cache
def backward_propagetion_with_dropout(parameters, cache, x, y, lambd=0, keep_prob=0.7):
m = x.shape[1]
w1 = parameters[‘w1’]
w2 = parameters[‘w2’]
a1 = cache[‘a1’]
a2 = cache[‘a2’]
mask1 = cache[‘mask1’]
dz2 = a2 - y
dw2 = np.dot(dz2, a1.T) / m + lambd / m * w2
db2 = np.sum(dz2, axis=1, keepdims=True) / m
# Dropout的关键操作
da1 = np.dot(w2.T, dz2)
da1 = da1 * mask1
da1 = da1 / keep_prob
dz1 = np.multiply(np.dot(w2.T, dz2), (1 - np.power(a1, 2)))
dw1 = np.dot(dz1, x.T) / m + lambd / m * w1
db1 = np.sum(dz1, axis=1, keepdims=True) / m
grads = {
"dw1": dw1,
"db1": db1,
"dw2": dw2,
"db2": db2,
}
return grads
4.PyTorch中实现dropout
class Dropout:
def init(self, dropout_ratio=0.5):
self.dropout_ratio = dropout_ratio
self.mask = None
def forward(self, x, train_flg=True):
if train_flg:
self.mask = np.random.rand(*x.shape) > self.dropout_ratio
return x * self.mask
else:
return x * (1.0 - self.dropout_ratio)
def backward(self, dout):
return dout * self.mask
最后
以上就是朴素心情为你收集整理的task5的全部内容,希望文章能够帮你解决task5所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复