分类实战——以AlexNet为例的代码详解
分类实战——以AlexNet为例的代码详解
1 | from torchvision import models |
nn.Conv2d()的参数分别为
输入特征图数量
输出特征图数量
卷积核大小
步长
padding
各层次的代码
卷积第一层
1 | # 定义第一个卷积层 |
我们输入的原始图片尺寸为3通道,我们用Conv2d转化为64通道输出,在Conc2d中使用长度为11的卷积核,步长为4,边框长度2
这时获取的特征图尺寸为 64 [(224 - 11 + 22)/4 + 1]^2, 即64 55 55
再通过池化,nn.MaxPool2d(3, 2)
表示窗口大小为3*3,滑动步长为2
输出特征图尺寸为:[64 (55 - 3 +0)/2 + 1]^2 即 64 27*27
卷积第二层
1 | # 定义第二个卷积层 |
将特征图尺寸化为192 [(27-5+22)/1 +1] 2,即192 27 *27
同理,再进行池化,化为19213 13
卷积第三四五层
1 | # 定义第三个卷积层 |
通过三次连续的卷积变换将特征图尺寸变为256 13 13
再池化两次
1 | # 定义第三个最大池化层,池化核大小为3x3,步长为2 |
再通过两次池化,进一步缩小特征图,将尺寸缩小为256 6 6
将特征图降维成一维的
1 | # 将多维张量展平为一维,以便输入全连接层 |
再通过全连接层建立模型
1 | # 定义第一个全连接层,输入特征数为9216,输出特征数为4096 |
这里和回归是一致的,不做过多叙述
各个层的作用
卷积层 (self.conv1
, self.conv2
, self.conv3
, self.conv4
, self.conv5
)
卷积操作可以捕捉图像的局部信息,通过共享权重减少参数量,还可以提取更高级、复杂、抽象的特征
池化层 (self.pool1
, self.pool2
, self.pool3
)
池化层可以通过对特征图进行下采样,降低计算量,防止过拟合
自适应平均池化层 (self.pool4
)
它将特征图尺寸调整为固定的输出尺寸,方便后面的全连接层进行处理
这里使用平均池化,可以让特征图更平滑
展平操作 (x.view(x.size()[0], -1)
)
将多维特征图降维成一维向量,便于后续分类
全连接层 (self.fc1
, self.fc2
, self.fc3
)
将提取的特征通过全连接层映射到分类任务中
整体过程
- 特征提取:
- 卷积层和池化层逐步提取输入图像的低级到高级特征。
- 降维:
- 池化层和自适应池化层减少特征图的空间尺寸,降低计算复杂度。
- 特征组合:
- 全连接层将提取的特征组合起来,生成最终的分类结果。
- 分类:
- 最后一层全连接层输出每个类别的得分,用于分类任务。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 半岛Hantou的博客!