🤵 Author :Horizon John
✨ 编程技巧篇:各种操作小结
🎇 机器视觉篇:会变魔术 OpenCV
💥 深度学习篇:简单入门 PyTorch
🏆 神经网络篇:经典网络模型
💻 算法篇:再忙也别忘了 LeetCode
[ 图像分类 ] 经典网络模型1——AlexNet 详解与复现
🚀 AlexNet
AlexNet
是2012年 Alex Krizhevsky 等人提出的一种的深度学习结构,并以其名命名;
拥有6000万个参数和65万个神经元,由5个卷积层组成,后面跟着3个全连接层和1000的softmax;
在2012年第一届 ImageNet 挑战赛(ILSVRC) classification 任务中获得 冠军, 开辟了深度卷积神经网络的新纪元;
![](https://i-blog.csdnimg.cn/blog_migrate/e4bfbafa14994d7da6e2f43f03db4ebd.gif#pic_center)
🔗 论文地址:ImageNet Classification with Deep Convolutional Neural Networks
🚀 AlexNet 详解
🎨 AlexNet 网络结构
AlexNet 一共包含 8个学习层 —— 5个卷积层 和 3个全连接层 ;
单一映射
:卷积 第 2 层、第 4 层 和 第 5 层 的核只连接到前一层的核映射上 ;
多映射
:卷积 第 3 层 的核连接到 第 2 层 的所有核映射上 ;
全连接
:全连接层中的神经元与 前一层中的所有神经元相连接 ;
非线性激活
:每个卷积层 和 全连接层的输出应用 ReLU非线性 ;
🎨 AlexNet 网络特点
它在多方面使用了创新性的结构 ;
(1)提出了 非饱和神经元 ReLU
减小 梯度下降
的训练时间;
(2)提用了 多GPU并行卷积操作
实现模型训练 加速
;
(3)提用了 LRN(Local Response Normalization)
实现局部响应 归一化
;
(4)提出了 Overlapping Pooling
使用 stride=2,kernal_size=3 使池化重叠,优于之前的 stride=2,kernal_size=2 ;
(5)引入了 dropout
正则化方法减少 全连接层中的 过拟合
;
(6)此外,还采用 数据增强
的方法扩充数据集用以减小 过拟合
线性;
论文中 数据增强 采用的方式 :1、图像的平移和水平旋转;2、改变图像RGB通道的强度;
🚀 AlexNet 复现
# Here is the code :
import torch
import torch.nn as nn
from torchinfo import summary
class AlexNet(nn.Module):
def __init__(self, num_classes=1000):
super(AlexNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 48, kernel_size=11, stride=4, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(48, 128, kernel_size=5, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(128, 192, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(192, 192, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(192, 128, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
)
self.classifier = nn.Sequential(
nn.Linear(128 * 6 * 6, 2048),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(2048, 2048),
nn.ReLU(inplace=True),
nn.Linear(2048, num_classes),
)
def forward(self, x):
x = self.features(x)
x = torch.flatten(x, 1)
out = self.classifier(x)
return out
def test():
net = AlexNet()
y = net(torch.randn(1, 3, 224, 224))
print(y.size())
summary(net, (1, 3, 224, 224))
if __name__ == '__main__':
test()
输出结果:
torch.Size([1, 1000])
==========================================================================================
Layer (type:depth-idx) Output Shape Param #
==========================================================================================
AlexNet -- --
├─Sequential: 1-1 [1, 128, 6, 6] --
│ └─Conv2d: 2-1 [1, 48, 55, 55] 17,472
│ └─ReLU: 2-2 [1, 48, 55, 55] --
│ └─MaxPool2d: 2-3 [1, 48, 27, 27] --
│ └─Conv2d: 2-4 [1, 128, 27, 27] 153,728
│ └─ReLU: 2-5 [1, 128, 27, 27] --
│ └─MaxPool2d: 2-6 [1, 128, 13, 13] --
│ └─Conv2d: 2-7 [1, 192, 13, 13] 221,376
│ └─ReLU: 2-8 [1, 192, 13, 13] --
│ └─Conv2d: 2-9 [1, 192, 13, 13] 331,968
│ └─ReLU: 2-10 [1, 192, 13, 13] --
│ └─Conv2d: 2-11 [1, 128, 13, 13] 221,312
│ └─ReLU: 2-12 [1, 128, 13, 13] --
│ └─MaxPool2d: 2-13 [1, 128, 6, 6] --
├─Sequential: 1-2 [1, 1000] --
│ └─Linear: 2-14 [1, 2048] 9,439,232
│ └─ReLU: 2-15 [1, 2048] --
│ └─Dropout: 2-16 [1, 2048] --
│ └─Linear: 2-17 [1, 2048] 4,196,352
│ └─ReLU: 2-18 [1, 2048] --
│ └─Linear: 2-19 [1, 1000] 2,049,000
==========================================================================================
Total params: 16,630,440
Trainable params: 16,630,440
Non-trainable params: 0
Total mult-adds (M): 311.52
==========================================================================================
Input size (MB): 0.60
Forward/backward pass size (MB): 2.64
Params size (MB): 66.52
Estimated Total Size (MB): 69.77
==========================================================================================