Dropout

torch.rand:生成0,1之间的均匀分布的矩阵

torch.rand 的基本语法是:

1
torch.rand(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  • *size:指定张量的形状,可以是一个或多个维度的大小,例如 (3, 4)(2, 3, 4) 等。
  • out:输出张量(默认为 None),如果指定,生成的结果会存储在该张量中。
  • dtype:生成张量的数据类型,默认为 torch.float32
  • layout:张量的布局方式(一般默认为 torch.strided)。
  • device:张量所放置的设备(CPU 或 GPU),默认为 None,表示张量生成在当前设备上。
  • requires_grad:是否需要计算梯度,默认为 False

torch.rand_like生成和输入的向量形状一样的向量

布尔掩码

在实现DropOut的时候,如何对一个张量里的每一个元素按照给定的概率进行随机置零呢。我们可以按照给定的概率使用 torch.rand_like 生成0,1矩阵,这个矩阵也就是布尔掩码,然后用这个矩阵和张量进行逐元素相乘。当然,如果是在实现Dropout层的话,还要对得到的结果乘以$\frac{1}{1-p}$来得到最后的张量。

1
mask = torch.rand_like(x) > p

BatchNorm

实现归一化,首先有两个学习参数,一个是缩放参数$\gamma$,一个是偏移参数$\beta$,在学习过程中,由每一个样本的均值和方差,不断更新总的均值和方差,但是训练过程中的计算是用的该样本的均值和方差,最后计算出的总均值和方差是用于训练完成之后的计算使用。

torch.nn.Parameter

torch.nn.Parameter 是一个包装类,用于将一个张量标记为模型的参数,用Parameter初始化的参数都会在训练过程中自动更新(相当于创建向量时,requires_grad=True),在nn.Module定义的类当中使用Parameter,会将该张量添加到模型参数中进行自动更新

你可以使用 torch.nn.init 模块对 Parameter 进行初始化

1
2
3
4
5
6
7
from torch.nn import init

# 初始化权重为正态分布
init.normal_(model.weight, mean=0.0, std=1.0)

# 初始化偏置为 0
init.zeros_(model.bias)

torch.mean 用于计算给定张量的均值(平均值)。均值是所有元素之和除以元素的数量。

1
torch.mean(input, dim=None, keepdim=False, dtype=None)

默认情况下是对整个张量求均值,得到的是一个标量数字,如果指定了dim,那么就会按照指定的方向求均值,比如在二维张量中dim为0,那么就对对所有的第一维求均值(也就是对所有的行求均值)。

每沿着一个dim求均值,这个dim维度内得元素个数就会下降到1,比如对维度为[2,3,4,4]的张量关于dim=(0,2,3)求均值后,在keepdim=True的条件下就会变成[1,3,1,1]

squeeze方法就是去除维度为1的轴。

torch.var 用于计算给定张量的方差。

广播机制

对于二维的情况下,计算均值和方差的时候,我们利用广播机制进行计算,先将形状为[num_fetures]的参数进行x.view(1,-1,1,1)的操作,然后与输入张量进行运算,由于广播机制会自动通过复制已有值得方式补全维度不一样的部分,所以可以实现运算。

卷积层

Conv2d 的常见参数:

1
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')
  • in_channels:输入的通道数(例如,RGB 图像的通道数为 3)。
  • out_channels:卷积层输出的通道数,即卷积核的数量。
  • kernel_size:卷积核的大小,可以是一个整数(表示正方形卷积核)或一个元组 (height, width)
  • stride:步幅,默认是1,表示卷积核每次移动的像素步长。
  • padding:填充大小,默认是0,用于在输入的边缘添加零填充。
  • dilation:扩张卷积的步幅,默认为1。
  • groups:分组卷积的数量,默认是1,表示标准卷积。
  • bias:是否添加偏置项,默认是 True
  • padding_mode:填充的方式,默认为 'zeros',也可以是 'reflect''replicate'

池化层

池化层会将一个窗口替换为一个元素,一个44的张量,经过2 2的池化后就会变成一个2 *2的张量

最大池化&平均池化

1
2
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
torch.nn.AvgPool2d(kernel_size, stride=None, padding=0, dilation=1, count_include_pad=True, ceil_mode=False)
  • kernel_size:池化窗口的大小。可以是一个整数(表示正方形的池化窗口)或一个元组 (height, width)(表示矩形池化窗口)。
  • stride:池化操作的步幅。默认情况下,步幅等于 kernel_size,即池化窗口每次移动一个窗口的大小。如果步幅为 None,则步幅默认为 kernel_size
  • padding:在输入的边缘添加的零填充。默认值为 0。
  • dilation:池化的膨胀系数,默认值为 1。通常用于扩张卷积,池化时不太常用。
  • return_indices:对于 MaxPool2d,如果设置为 True,池化层会返回池化操作中最大值的索引(用于反向传播时的梯度计算)。默认值为 False
  • ceil_mode:如果为 True,则采用向上取整的方式来计算输出大小。默认值为 False