Pytorch中二维卷积nn.Conv2d的理解

目录

  • 函数定义
  • 例子
    • 第一次卷积
    • 池化
    • 第二次卷积
    • 第一次全连接
    • 第二次全连接

函数定义

class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

例子

以MNIST数据集手写数字识别为例,网络定义如下:

class ConvNet(nn.Module):
    def __init__(self):
        super().__init__()
        # 1,28x28
        self.conv1=nn.Conv2d(1,10,5) # 10, 24x24
        self.conv2=nn.Conv2d(10,20,3) # 128, 10x10
        self.fc1 = nn.Linear(20*10*10,500)
        self.fc2 = nn.Linear(500,10)
    def forward(self,x):
        in_size = x.size(0)
        out = self.conv1(x) #24
        out = F.relu(out)
        out = F.max_pool2d(out, 2, 2)  #12
        out = self.conv2(out) #10
        out = F.relu(out)
        out = out.view(in_size,-1)
        out = self.fc1(out)
        out = F.relu(out)
        out = self.fc2(out)
        out = F.log_softmax(out,dim=1)
        return out

网络的整体结构为:conv -> relu -> max_pool -> conv -> relu -> fc -> relu -> fc -> log_softmax
原始输入样本的大小:28 x 28 x 1
以上网络图解如下:

第一次卷积

使用10个大小为5 x 5的卷积核,故卷积核的规模为(5 x 5) x 10;卷积操作的stride参数默认值为1 x 1,28 - 5 + 1 = 24,并且使用ReLU对第一次卷积后的结果进行非线性处理,输出大小为24 x 24 x 10。

池化

kernel_size为2 x 2,stride为2(不指定的情况下,在PyTorch中,池化操作默认的stride大小与卷积核的大小一致,即为2)输出大小变为12 x 12 x 10。(12 = 14 / 2)

第二次卷积

使用20组规模为(3 x 3) x 10的卷积核;卷积操作的stride参数默认值为1 x 1,12 - 3 + 1 = 10,并且使用ReLU对第一次卷积后的结果进行非线性处理,输出大小为10 x 10 x 20。

第一次全连接

将上一步得到的结果铺平成一维向量形式,10 x 10 x 20 = 2000,即输入大小为2000 x 1,W大小为500 x 2000,输出大小为500 x 1。然后使用ReLu进行非线性处理。

第二次全连接

输入大小为500 x 1,W大小为10 x 500,输出大小为10x 1。然后使用log_softmax处理。

你可能感兴趣的:(人工智能,神经网络)