详解torch.nn.Conv2d类
torch.nn.Conv2d
类实现了对特征图的2D卷积,是搭建卷积网络时最常用的层之一。在使用时,我们需要关注下列参数:
1. in_channels与out_channels
in_channels
与out_channels
控制了特征图四个维度[B, C, H, W]
中的通道数C
,是确定参数形状所必须的。
2. kernel_size
kernel_size
声明了卷积核的大小。可以传入一个整数,代表正方形卷积核的边长,也可以传入一个形如(H, W)的tuple
,从而定义长方形的卷积核。kernel_size
越大,此卷积层的感受野越大,从而使模型获得更多上下文信息。如果将kernel_size
设为1,此层可看作一个全连接层,可以方便地修改特征图的通道数。
3. stride, padding, padding_mode, dilation, bias
stride
参数控制了卷积操作的步长,可以是一个整数,也可以一个是tuple
,对横纵方向的步长分别控制。padding
参数控制了对输入特征图的边缘填充,而padding_mode
参数声明了填充方法(默认为’zeros’, 可选’reflect’, ‘replicate’, ‘circular’)。bias
参数控制是否使用偏置,默认为True
。
dilation
参数控制空洞卷积,默认为1,即不使用空洞卷积。在实际应用中,使用空洞卷积能提供更大的感受野,从而获得更多上下文以及空间信息。相比起增大卷积核,空洞卷积的优势在于不增加参数量,效率更高。常见于语义分割网络,如DeepLab系列的SSP、ASPP。
4. 尺寸计算
官方文档提供了尺寸计算方法:
当然,在实际使用时,要想检查输入输出的尺寸,直接打印张量的形状即可,不需要自行计算。
5. 使用例
以下是一个使用torch.nn.Conv2d
的简单例子:
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(kernel_size=3, in_channels=3, out_channels=32)
self.linear1 = nn.Linear(in_features=4*32*62*62, out_features=2)
def forward(self, x):
x = self.conv1(x)
print(x.shape)
x = x.view(-1)
x = self.linear1(x)
return x
model = Net()
a = torch.randn(4,3,64,64)
print(model(a).shape)
#输出
torch.Size([4, 32, 62, 62])
torch.Size([2])
在上面的代码中,我们建立了一个名为Net的Module
类作为模型,包含一个卷积层和一个全连接层。我们定义了一个尺寸为[4, 3, 32, 32]
的张量作为模型输入,获得了一个尺寸为[2]
的输出。