计算全连接层的尺寸?

Calculating dimensions of fully connected layer?

我正在努力研究如何计算全连接层的尺寸。我正在使用批量大小 (16) 输入 (448x448) 的图像。下面是我的卷积层的代码:

class ConvolutionalNet(nn.Module):
  def __init__(self, num_classes=182):
    super().__init__()

    self.layer1 = nn.Sequential(
        nn.Conv2d(3, 16, kernal_size=5, stride=1, padding=2),
        nn.BatchNorm2d(16),
        nn.ReLU(),
        nn.MaxPool2d(kernal_size=2, stride=2)
    )

    self.layer2 = nn.Sequential(
        nn.Conv2d(16, 32, kernal_size=5, stride=1, padding=2),
        nn.BatchNorm2d(32),
        nn.ReLU(),
        nn.MaxPool2d(kernal_size=2, stride=2)
    )

    self.layer3 = nn.Sequential(
        nn.Conv2d(32, 32, kernal_size=5, stride=1, padding=2),
        nn.BatchNorm2d(32),
        nn.ReLU(),
        nn.MaxPool2d(kernal_size=2, stride=2)
    )

    self.layer4 = nn.Sequential(
        nn.Conv2d(32, 64, kernal_size=5, stride=1, padding=2),
        nn.BatchNorm2d(64),
        nn.ReLU(),
        nn.MaxPool2d(kernal_size=2, stride=2)
    )

    self.layer5 = nn.Sequential(
        nn.Conv2d(64, 64, kernal_size=5, stride=1, padding=2),
        nn.BatchNorm2d(64),
        nn.ReLU(),
        nn.MaxPool2d(kernal_size=2, stride=2)
    )

我要添加一个全连接层:

self.fc = nn.Linear(?, num_classes)

谁能解释计算这个的最佳方法?另外,如果我有多个完全连接的层,例如(self.fc2, self.fc3),第二个参数是否总是等于类的个数。我是编码新手,发现很难解决这个问题。

conv 层不会更改特征的 width/height,因为您已将 padding 设置为 (kernel_size - 1) / 2kernel_size = stride = 2 的最大池化将使 width/height 减少 2 倍(如果输入形状不均匀则向下舍入)。

使用 448 作为输入 width/height,输出 width/height 将是 448 // 2 // 2 // 2 // 2 // 2 = 448/32 = 14(其中 // 是 floor-divide 运算符)。

通道数完全由最后一个conv层决定,它输出64个通道。

因此你会有一个 [B,64,14,14] 形状的张量,所以 Linear 层应该有 in_features = 64*14*14 = 12544.

请注意,您需要事先展平输入,例如。

self.layer6 = nn.Sequential(
    nn.Flatten(),
    nn.Linear(12544, num_classes)
)