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 | from torch.nn import init |
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 | torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, 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
。