一、正则化层
torch.nn.BatchNorm2d
torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True, device=None, dtype=None)
正则化的意义:
-
加速训练收敛:在每一层网络的输入上执行批量归一化可以保持数据的分布稳定,从而减小梯度的波动。这种稳定性让模型更快收敛,从而提高训练速度。
-
减轻梯度消失和梯度爆炸问题:通过调整每一层的输入分布,Batch Normalization可以减轻深层网络中梯度消失和梯度爆炸的现象,使得更深的网络也能够得到有效的训练。
-
减少对权重初始化的敏感性:Batch Normalization可以减小网络对权重初始化的依赖,使得模型可以在更宽的初始化范围内有效训练。这减少了在不同模型初始化方案间进行调试的时间和精力。
-
提高模型的泛化能力:Batch Normalization在训练时引入了少量噪声(由于 mini-batch 的不同),这在一定程度上起到了正则化作用,有助于提高模型的泛化能力,降低过拟合的风险。
-
降低学习率调整的难度:使用Batch Normalization可以让模型在较高的学习率下进行训练,从而进一步加速训练过程。
二、Dropout层
torch.nn.Dropout
torch.nn.Dropout(p=0.5, inplace=False)
防止过拟合
三、线性层
torch.nn.Linear
torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None)
代码实现:
CIFAR 中的图片 转换为 一维的数据(1,m),再转换成 (1,n) 的维度
import torch
import torchvision
from torch import nn
from torch.nn import Linear
from torch.utils.data import DataLoader
dataset = torchvision.datasets.CIFAR10(root="datasets",train=False,transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(dataset,batch_size=64)
class Mary(nn.Module):
def __init__(self):
super(Mary,self).__init__()
self.linear1 = Linear(196608,10)
def forward(self,x):
x = self.linear1(x)
return x
Yorelee = Mary()
for data in dataloader:
img,targets = data
img = torch.flatten(img)
print(img.shape)
output = Yorelee(img)
print(output.shape)
输出:
torch.Size([196608])
torch.Size([10])