如何从原始图像尺寸计算卷积核尺寸?

https://github.com/kuangliu/pytorch-cifar/blob/master/models/resnet.py

https://www.cs.toronto.edu/~kriz/cifar.html可以了解到,CIFAR数据集中的每张图像尺寸为32×32。

我对代码的理解是:

self.conv1 = nn.Conv2d(3, 6, 5)self.conv2 = nn.Conv2d(6, 16, 5)self.fc1   = nn.Linear(16*5*5, 120)

如下所示:

self.conv1 = nn.Conv2d(3, 6, 5) # 输入3通道,输出6通道,卷积核大小为5self.conv2 = nn.Conv2d(6, 16, 5) # 输入6通道,输出16通道,卷积核大小为5self.fc1   = nn.Linear(16*5*5, 120) # 输入特征16*5*5,输出特征120

在resnet.py中,以下代码是:

self.fc1   = nn.Linear(16*5*5, 120)

http://cs231n.github.io/convolutional-networks/中提到如下内容:

总结。对卷积层进行总结:

接受尺寸为W1×H1×D1的体数据,需要四个超参数:滤波器数量K,它们的空间范围F,步长S,零填充量P。产生尺寸为W2×H2×D2的体数据,其中:W2=(W1−F+2P)/S+1 H2=(H1−F+2P)/S+1(即宽度和高度通过对称性同样计算)D2=K,通过参数共享,每个滤波器引入F⋅F⋅D1个权重,总共有(F⋅F⋅D1)⋅K个权重和K个偏置。在输出体数据中,第d个深度切片(尺寸为W2×H2)是将第d个滤波器在输入体数据上以步长S进行有效卷积的结果,然后加上第d个偏置进行偏移。

从中我试图理解训练图像尺寸32×32(1024像素)是如何转换为特征图(16*5*5 -> 400)的,作为nn.Linear(16*5*5, 120)的一部分

https://pytorch.org/docs/stable/nn.html#torch.nn.Conv2d可以看到,默认步长为1,填充为0。

从32*32的图像尺寸到达16*5*5的步骤是什么?16*5*5能否从上述步骤中推导出来?

从上述步骤如何计算spatial extent

更新:

源代码如下:

'''LeNet in PyTorch.'''import torch.nn as nnimport torch.nn.functional as Fclass LeNet(nn.Module):    def __init__(self):        super(LeNet, self).__init__()        self.conv1 = nn.Conv2d(3, 6, 5)        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):        out = F.relu(self.conv1(x))        out = F.max_pool2d(out, 2)        out = F.relu(self.conv2(out))        out = F.max_pool2d(out, 2)        out = out.view(out.size(0), -1)        out = F.relu(self.fc1(out))        out = F.relu(self.fc2(out))        out = self.fc3(out)        return out

来自https://github.com/kuangliu/pytorch-cifar/blob/master/models/lenet.py

我的理解是卷积操作是针对每张图像数据应用的卷积核。如果设置了5个卷积核,那么将对数据应用5次卷积操作,这会生成一个5维度的图像表示。


回答:

你的问题中提供的信息不足(请参见我的评论)。

但是,如果我必须猜测的话,你在卷积层之间有两个池化层(步长为2):

  • 输入尺寸32×32(3通道)
  • conv1输出尺寸28×28(6通道):没有填充的卷积,卷积核大小为5,输入尺寸减少4。
  • 步长为2的池化层,输出尺寸14×14(6通道)。
  • conv2输出尺寸10×10(16通道)
  • 另一个步长为2的池化层,输出尺寸5×5(16通道)
  • 一个全连接层(nn.Linear)连接所有5x5x16输入到所有120输出。

关于估计感受野的更详细指南可以在这里找到这里

Related Posts

Flatten and back keras

我正在尝试使用自编码器获取简单向量中的值 这是我的代码…

如何按索引访问PyTorch模型参数

如果我的网络有10层,包括偏置项,如何仅通过索引访问第…

Python中多元逻辑回归显示错误

我试图使用逻辑回归进行预测,并使用Python和skl…

在MACOS上安装NLTK

我在我的2015款Mac Pro上尝试安装NLTK,操…

如何在R中将通过RFE选择的变量插入到机器学习模型中?

我想使用递归特征消除方法来选择最重要的特征,然后将这些…

CountVectorizer 错误:ValueError: setting an array element with a sequence

我有一个包含144条学生反馈的数据集,其中有72条正面…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注