首页 > 解决方案 > CNN pytorch:如何选择参数并在层之间流动

问题描述

我对 CNN 很陌生,并且一直在遵循以下代码。我无法理解我们如何以及为什么选择 Conv2d() 和 nn.Linear () 的每个参数,因为它们是输出、过滤器、通道、权重、填充和步幅。我确实理解每个的含义。有人可以非常简洁地解释每一层的流程吗?(输入图像尺寸为 32*32*3)

import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, 3, padding=1)
        self.conv2 = nn.Conv2d(16, 32, 3, padding=1)
        self.conv3 = nn.Conv2d(32, 64, 3, padding=1)
        self.pool = nn.MaxPool2d(2, 2)
        self.fc1 = nn.Linear(64 * 4 * 4, 500)
        self.fc2 = nn.Linear(500, 10)
        self.dropout = nn.Dropout(0.25)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = self.pool(F.relu(self.conv3(x)))
        x = x.view(-1, 64 * 4 * 4)
        x = self.dropout(x)
        x = F.relu(self.fc1(x))
        x = self.dropout(x)
        x = self.fc2(x)
        return x

标签: pythondeep-learningneural-networkconv-neural-networkpytorch

解决方案


我认为您会发现感受野算术对您的理解很有用。

您的网络有 3 个卷积层,每个卷积层的内核大小为 3x3,填充为 1 个像素,这意味着您的卷积层的空间输出与其输入相同。
每个卷积层后面跟着一个步幅为 2 的最大池化,也就是说,它将空间维度减少了 2 倍。

因此,在空间域中,在第一个 conv 和 pool 之后,您有一个大小为 32x32 的输入,它的尺寸是 16x16,在第二个 conv 和 pool 之后它是 8x8,在第三个 conv+pool 之后它是 4x4。

至于“特征”/“通道”维度:输入有 3 个通道。第一个卷积层有 16 个过滤器 ( "out_channels=16"),然后是 32 个,最后是 64 个。
因此,在三个卷积层之后,您的特征图有 64 个通道(每个空间位置)。总体而言,在您的网络定义的三个 conv+pooling 层之后,大小为 3x32x32 的输入变为 64x4x4。

nn.Linear图层不为其输入分配“空间”含义,并期望一维输入(小批量中的每个条目),因此您的函数forward“消除”空间维度并使用命令转换x为一维向量。x.view(-1, 64 * 4 * 4)


推荐阅读