【发布时间】:2019-02-02 06:57:29
【问题描述】:
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/ 声明如下:
总结。总而言之,Conv 层:
接受大小为 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 像素)如何转换为特征图(16*5*5 -> 400)作为 nn.Linear(16*5*5, 120) 的 aprt
从https://pytorch.org/docs/stable/nn.html#torch.nn.Conv2d可以看到默认的stride是1,padding是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 维图像表示的数据。
【问题讨论】:
-
您需要查看实现
forwardpass 的代码:您似乎忽略了池化层,可能还有一些其他可能影响感受野大小的东西。
标签: python machine-learning deep-learning pytorch resnet