https://github.com/kuangliu/pytorch-cifar/blob/master/models/resnet.py
通过阅读https://www.cs.toronto.edu/~kriz/cifar.html,cifar数据集由每个尺寸为32x32的图像组成。
我对代码的理解:
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 channels in, 6 channels out , kernel size of 5
self.conv2 = nn.Conv2d(6, 16, 5) # 6 channels in, 16 channels out , kernel size of 5
self.fc1 = nn.Linear(16*5*5, 120) # 16*5*5 in features , 120 ouot feature
在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个偏差抵消。
由此,我试图了解如何将训练图像尺寸32x32(1024像素)作为nn.Linear(16*5*5, 120)
的特征图转换为特征图(16 * 5 * 5-> 400)
从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 nn
import torch.nn.functional as F
class 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维图像表示。
答案 0 :(得分:1)
您没有在问题中提供足够的信息(请参阅my comment)。
但是,如果我不得不猜测,那么在卷积层之间会有两个池化层(步幅为2):
conv1
输出大小28x28(6通道):转换,无填充,内核大小5,输入大小减少4。conv2
输出大小10x10(16个通道)nn.Linear
)。有关here的估计接收场的更详尽指南。