PyTorch中正则化设置相关

这几天训练CNN模型,发现自己模型严重过拟合,因为用的是PyTorch框架, 就查了一下相关代码
PyTorch中优化器部分:

optimizer = optim.Adam(model.parameters(),lr=learning_rate,weight_decay=0.01)

这里的weight_decay在官方文档里面是这样写的:

weight_decay (float, optional) – weight decay (L2 penalty) (default: 0)

是这里只是说了L2 penalty, 并没有具体说明是对weight做的正则,还是对weight + bias都做了正则。
于是,我具体看了一下
这里给出Adam的部分源码:

 def step(self, closure=None):
        """Performs a single optimization step.

        Arguments:
            closure (callable, optional): A closure that reevaluates the model
                and returns the loss.
        """
        loss = None
        if closure is not None:
            loss = closure()

        for group in self.param_groups:
            for p in group['params']:
                if p.grad is None:
                    continue
                grad = p.grad.data
                if grad.is_sparse:
                    raise RuntimeError('Adam does not support sparse gradients, please consider SparseAdam instead')
                amsgrad = group['amsgrad']

                state = self.state[p]
				# ... ...
                if group['weight_decay'] != 0:
                    grad.add_(group['weight_decay'], p.data)

代码中的group,指的是self.params_groups中的元素, 要想看self.param_groups中的weight_decay中是否有bias,自己看看
这是测试代码–参考链接:

import torch
# 引入torch.nn并指定别名
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        # nn.Module子类的函数必须在构造函数中执行父类的构造函数
        super(Net, self).__init__()
        
        # 卷积层 '1'表示输入图片为单通道, '6'表示输出通道数,'3'表示卷积核为3*3
        self.conv1 = nn.Conv2d(1, 6, 3) 
        #线性层,输入1350个特征,输出10个特征
        self.fc1   = nn.Linear(1350, 10)  #这里的1350是如何计算的呢?这就要看后面的forward函数
    #正向传播 
    def forward(self, x): 
        print(x.size()) # 结果:[1, 1, 32, 32]
        # 卷积 -> 激活 -> 池化 
        x = self.conv1(x) #根据卷积的尺寸计算公式,计算结果是30,具体计算公式后面第二张第四节 卷积神经网络 有详细介绍。
        x = F.relu(x)
        print(x.size()) # 结果:[1, 6, 30, 30]
        x = F.max_pool2d(x, (2, 2)) #我们使用池化层,计算结果是15
        x = F.relu(x)
        print(x.size()) # 结果:[1, 6, 15, 15]
        # reshape,‘-1’表示自适应
        #这里做的就是压扁的操作 就是把后面的[1, 6, 15, 15]压扁,变为 [1, 1350]
        x = x.view(x.size()[0], -1) 
        print(x.size()) # 这里就是fc1层的的输入1350 
        x = self.fc1(x)        
        return x

net = Net()
for name,parameters in net.named_parameters():
    print(name,':',parameters.size())
# ---
# output
conv1.weight : torch.Size([6, 1, 3, 3])
conv1.bias : torch.Size([6])
fc1.weight : torch.Size([10, 1350])
fc1.bias : torch.Size([10])

这里可以很清楚地看到,weight_decay是包括bias的。

参考文章

  • Pytorch 查看模型参数
  • pytorch实现L2和L1正则化regularization的方法

你可能感兴趣的:(PyTorch)