Pytorch_study_Task_5:PyTorch实现L1,L2正则化以及Dropout

1.了解知道Dropout原理

  • Dropout是一种在学习的过程中随机删除神经元的方法。训练时,随机选出隐藏层的神经元,然后将其删除。被删除的神经元不再进行信号的传递,如下图a所示。训练时,每传递一次数据,就会随机选择要删除的神经元。然后,测试时,虽然会传递所有的神经元信号,但是对于各个神经元的输出,要乘上训练时的删除比例后再输出。训练时如果进行恰当的计算的话,正向传播时单纯地传递数据就可以了(不用乘以删除比例)。

在这里插入图片描述
图1 Dropout的概念图:左边是一般的神经网络,右边是应用了Dropout的网络。Dropout通过随机选择并删除神经元,停止向前传递信号。

2.用代码实现正则化(L1、L2、Dropout)

假设有权重W = (w 1 , w 2 , … , w n )。
L1 正则化的表达是把所有神经层的所有权值做绝对值的和,即相当于
|w 1 | + |w 2 | + … + |w n |。

L2 正则化的表达是把所有神经层的所有权值做平方和,相当于
√ ̄( w 1 2 + w 2 2 + … + w n 2 )

正则化运用在求权重梯度的计算中,为之前的误差反向传播法的结果加上正则化项的导数。

举个例子,先建立两个神经层:

l1 = Layer(x, 13, 50, T.tanh)
l2 = Layer(l1.outputs, 50, 1, None)

再计算 cost:

  • 没有正则化的表达式:
cost = T.mean(T.square(l2.outputs - y))   
  • 运用L1 正则化的表达式:
cost = T.mean(T.square(l2.outputs - y)) + 0.1 * (abs(l1.W).sum() + abs(l2.W).sum())
  • 运用L2 正则化的表达式:
cost = T.mean(T.square(l2.outputs - y)) + 0.1 * ((l1.W ** 2).sum() + (l2.W ** 2).sum())

3.Dropout的numpy实现

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

4.PyTorch中实现dropout

  • 建立数据:
import torch

torch.manual_seed(1)    # reproducible

N_SAMPLES = 20
N_HIDDEN = 300

# training data
x = torch.unsqueeze(torch.linspace(-1, 1, N_SAMPLES), 1)
y = x + 0.3*torch.normal(torch.zeros(N_SAMPLES, 1), torch.ones(N_SAMPLES, 1))

# test data
test_x = torch.unsqueeze(torch.linspace(-1, 1, N_SAMPLES), 1)
test_y = test_x + 0.3*torch.normal(torch.zeros(N_SAMPLES, 1), torch.ones(N_SAMPLES, 1))
  • 建立神经网络 :
net_dropped = torch.nn.Sequential(
    torch.nn.Linear(1, N_HIDDEN),
    torch.nn.Dropout(0.5),  # drop 50% of the neuron
    torch.nn.ReLU(),
    torch.nn.Linear(N_HIDDEN, N_HIDDEN),
    torch.nn.Dropout(0.5),  # drop 50% of the neuron
    torch.nn.ReLU(),
    torch.nn.Linear(N_HIDDEN, 1),
)
  • 训练网络:
optimizer_drop = torch.optim.Adam(net_dropped.parameters(), lr=0.01)
loss_func = torch.nn.MSELoss()

for t in range(500):
    pred_drop = net_dropped(x)
    
    loss_drop = loss_func(pred_drop, y)

    optimizer_drop.zero_grad()
    loss_drop.backward()
    optimizer_drop.step()

注:

  • 代码参考莫烦PYTHON:

https://morvanzhou.github.io/tutorials/machine-learning/theano/3-5-regularization/

https://morvanzhou.github.io/tutorials/machine-learning/torch/5-03-dropout/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch的Conv2d层默认不包含L2正则化,但可以通过添加权重衰减参数来实现L2正则化。具体方法是在定义优化器时,将weight_decay参数设置为一个非零值,代表权重衰减的强度。例如,以下代码展示了如何使用L2正则化来训练一个简单的卷积神经网络: ``` import torch import torch.nn as nn import torch.optim as optim # 定义卷积神经网络 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool(nn.functional.relu(self.conv1(x))) x = self.pool(nn.functional.relu(self.conv2(x))) x = x.view(-1, 16 * 5 * 5) x = nn.functional.relu(self.fc1(x)) x = nn.functional.relu(self.fc2(x)) x = self.fc3(x) return x # 定义优化器并添加L2正则化 net = Net() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9, weight_decay=0.001) # 训练网络 for epoch in range(10): running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data optimizer.zero_grad() outputs = net(inputs) loss = nn.CrossEntropyLoss()(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() if i % 2000 == 1999: print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 2000)) running_loss = 0.0 ``` 在定义优化器时,将weight_decay参数设置为0.001,即可实现L2正则化。需要注意的是,权重衰减是一种常用的正则化方法,但并不是唯一的正则化方法。在深度学习中,还有其他正则化方法如L1正则化Dropout等,可以根据具体情况选择合适的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值