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输出。
关于估计感受野的更详细指南可以在这里找到这里。