「深度学习一遍过」必修9:解读卷积神经网络 AlexNet
2023-04-18 16:53:55 时间
本专栏用于记录关于深度学习的笔记,不光方便自己复习与查阅,同时也希望能给您解决一些关于深度学习的相关问题,并提供一些微不足道的人工神经网络模型设计思路。 专栏地址:「深度学习一遍过」必修篇
目录
3.1 通过 torchvision.models 导入 AlexNet
1 AlexNet 模型解读
1.1 AlexNet 模型特点
AlexNet论文的特点如下:
- 更深的网络结构
- 使用层叠的卷积层,即卷积层+ 卷积层+ 池化层来提取图像的特征
- 使用 dropout 抑制过拟合
- 使用数据增强 Data Augmentation抑制过拟合
- 使用 relu 替换之前的 sifmoid 的作为激活函数
- 使用多 GPU 进行训练
1.2 AlexNet 模型结构
AlexNet网络结构如下:
1.2.1 卷积层1
输入图像大小:277×277×3
- 卷积核大小:11×11
- 数量:48 个
- 步长:4
- 激活函数:relu
- 两台 GPU 同时训练,即共 96 个核
输出特征图大小:(277-11)/4+1=55 ,即 55×55×96
池化:kernel size=3,stride=2
- 输出特征图大小:(55-3)/2+1=27 ,即 27×27×96 标准化
1.2.2 卷积层2
输入图像大小:27×27×96
- 卷积核大小:5×5
- 数量:128 个
- 步长:1
- 激活函数:relu
- 输出特征图像先扩展 2 个像素,即大小 31×31 输出特征图大小:(31-5)/1+1=27 ,即 27×27×256
池化:kernel size=3,stride=2
- 输出特征图大小:(27-3)/2+1=13 ,即 13×13×256 标准化
1.2.3 卷积层3
输入图像大小:13×13×256
- 卷积核大小:3×3
- 数量:192 个
- 步长:1
- 激活函数:relu
- 输出特征图像先扩展 1 个像素,即大小 15×15输出特征图大小:(15-3)/1+1=13 ,即 13×13×384
1.2.4 卷积层4
输入图像大小:13×13×384
- 卷积核大小:3×3
- 数量:192 个
- 步长:1
- 激活函数:relu
- 输出特征图像先扩展 1 个像素,即大小 15×15 输出特征图大小:(15-3)/1+1=13 ,即 13×13×384
1.2.5 卷积层5
输入图像大小:13×13×384
- 卷积核大小:3×3
- 数量:128 个
- 步长:1
- 激活函数:relu
- 输出特征图像先扩展 1 个像素,即大小 15×15 输出特征图大小:(15-3)/1+1=13 ,即 13×13×256 池化:kernel size=3,stride=2
- 输出特征图大小:(13-3)/2+1=6 ,即 6×6×256
1.2.6 全连接6
- 输入图像大小:6×6×256
- 共 4096 个神经元
- dropout
- 输出 4096×1 个向量
1.2.7 全连接7
- 输入图像大小: 4096×1
- 共 4096 个神经元
- dropout
- 输出 4096×1 个向量
1.2.8 全连接8
- 输入图像大小: 4096×1
- 共 1000 个神经元
- dropout
- 输出 1000×1 个向量
dropout 也可以看成是一种模型组合,每次生成的网络结构都不一样,通过组合多个模型的方式能够有效地减少过拟合。
2 AlexNet工程技巧
多 GPU 训练,ReLU 激活函数,LRN 归一化,Dropout 正则化,重叠池化,数据增强
- Dropout,防止过拟合,提高泛化能力
- 重叠池化(overlapping),更有利于减轻过拟合
- 裁剪翻转等数据增强策略,提高模型泛化能力
- 多 GPU 训练,尽量使用更多特征图,并减少计算量
- LRN 归一化,抑制反馈较小的神经元,放大反馈较大的神经元,增强模型泛化能力
- ReLU 激活函数,加快模型收敛
3 代码解读
3.1 通过 torchvision.models 导入 AlexNet
from torchvision.models import AlexNet
3.2 Ctrl + 鼠标左键进入 AlexNet 源码
class AlexNet(nn.Module):
def __init__(self, num_classes: int = 1000) -> None:
super(AlexNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(64, 192, kernel_size=5, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(192, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(384, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(256, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
)
self.avgpool = nn.AdaptiveAvgPool2d((6, 6))
self.classifier = nn.Sequential(
nn.Dropout(),
nn.Linear(256 * 6 * 6, 4096),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Linear(4096, num_classes),
)
def forward(self, x: torch.Tensor) -> torch.Tensor:
x = self.features(x)
x = self.avgpool(x)
x = torch.flatten(x, 1)
x = self.classifier(x)
return x
卷积层 1
卷积层2
卷积层3、卷积层4、卷积层5
全连接层6、全连接层7、全连接层8
相关文章
- EasyCVR对接华为iVS订阅摄像机和用户变更请求接口介绍
- 精选 | 腾讯云CDN内容加速场景有哪些?
- 模块化网络防止基于模型的多任务强化学习中的灾难性干扰
- 用搜索和注意力学习稳健的调度方法
- 用于多变量时间序列异常检测的学习图神经网络
- 助力政企自动化自然生长,华为WeAutomate RPA是怎么做到的?
- 使用腾讯轻量云搭建Fiora聊天室
- TSRC安全测试规范
- 云计算“功守道”
- 助力成本优化,腾讯全场景在离线混部系统Caelus正式开源
- Flink 利器:开源平台 StreamX 简介
- 腾讯云实践 | 一图揭秘腾讯碳中和?解决方案
- 深度学习中的轻量级网络架构总结与代码实现
- 信息系统项目管理师(高项复习笔记三)
- Adobe国际认证让科技赋能时尚
- c++该怎么学习(面试吃土记)
- 面试官问发布订阅模式是在问什么?
- 面试官:请实现一个通用函数把 callback 转成 promise
- 空中悬停、翻滚转身、成功着陆,我用强化学习「回收」了SpaceX的火箭
- 中山大学林倞解读视觉语义理解新趋势:从表达学习到知识及因果融合