了解 Conv2d 的输入和输出大小

Jay*_*kur 4 python deep-learning conv-neural-network pytorch

我正在按照此链接使用 PyTorch(使用 CIFAR-10 数据集)学习图像分类。

我试图理解给定Conv2d代码的输入和输出参数:

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, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

net = Net()
Run Code Online (Sandbox Code Playgroud)

我的conv2d()理解(如有错误/遗漏,请指正):

  • 因为图像有 3 个通道,所以第一个参数是36过滤器数量(随机选择)
  • 5是内核大小 (5, 5)(随机选择)
  • 同样,我们创建下一层(上一层的输出是该层的输入)
  • 现在使用linear函数创建一个全连接层: self.fc1 = nn.Linear(16 * 5 * 5, 120)

16 * 5 * 5:这16是最后一个 conv2d 层的输出,但这5 * 5里面是什么?

这是内核大小吗?或者是其他东西?如何知道我们需要乘以5*5 or 4*4 or 3*3.....

我研究并知道,由于图像大小为32*32,应用 max pool(2) 2 次,因此图像大小将为 32 -> 16 -> 8,所以我们应该将其乘以 但last_ouput_size * 8 * 8在此链接中其5*5.

有人可以解释一下吗?

uke*_*emi 9

这些是图像大小本身的尺寸(即高度 x 宽度)。

未填充的卷积

filter_size - 1除非您用零填充图像,否则卷积滤波器将在高度和宽度上缩小输出图像的大小:

在此输入图像描述 在此输入图像描述
3-filter 将 5x5 图像转换为 (5-(3-1) x 5-(3-1)) 图像 零填充保留图像尺寸

您可以通过设置在 Pytorch 中添加填充Conv2d(padding=...)

转变链

既然已经经历了:

形状变换
一个转换层(无填充) (h, w) -> (h-4, w-4)
最大池 -> ((h-4)//2, (w-4)//2)
另一个转换层(无填充) -> ((h-8)//2, (w-8)//2)
另一个最大池 -> ((h-8)//4, (w-8)//4)
压扁 -> ((h-8)//4 * (w-8)//4)

我们从原始图像大小(32,32)(28,28)(14,14)(10,10)(5,5)(5x5)


为了可视化这一点,您可以使用该torchsummary包:

from torchsummary import summary

input_shape = (3,32,32)
summary(Net(), input_shape)
Run Code Online (Sandbox Code Playgroud)
from torchsummary import summary

input_shape = (3,32,32)
summary(Net(), input_shape)
Run Code Online (Sandbox Code Playgroud)