介绍
AlexNet是一个网络层数较多的模型,也就是一个很深的模型,在2012年的ImageNet比赛中大放异彩,算是一个深模型的开端。
参数量在逐层的增加
从下边这个图可以看出来,输入是224*224大小的,5个卷积层,两个全连接层,输出是1000分类
优点
AlexNet相比之前的一些卷积神经网络模型有了一些改进,也才能取得一定的成就。改进也主要是4方面:
-
使用ReLU函数做激活函数
此图为ReLU函数图像
ReLU函数(也叫斜坡函数)是一个很简单的函数,使得模型训练速度会很快,导数值很稳定,也能够很有效的进行梯度下降和反向传播,避免梯度消失。 -
使用分布式GPU计算(是提出GPU训练模型的先驱)
GPU训练可以加快训练速度,GPU内存很大。 -
加入LRN(局部响应归一化Local Response Normalization)
其中a表示经过激活函数的卷积特征图,N表示卷积之后的特征图数量,n表示近邻的特征图数量。k、α、β、n/2均为超参数,通常k=2, α=1e-4, β=0.75、n=5。
其实就是把一个像素点同它上下的n个特征图相同位置的像素点做处理,用到别的特征图的信息,和归一化处理很相似。
-
使用重叠池化
池化核大小大于步长
能多次提取重要特征,重复利用,防止重要特征被遗漏掉 -
正则化方法
①数据集增强
样本缩放和裁剪,先将样本缩小,然后逐步的取一小块区域,然后对图片进行水平翻转
例如:
首先,将图片等比缩放,使得最小边缩放为256。
其次,在缩放后的图片中部取一块[256, 256, 3]的图片。
再次,将取出的图片滑动裁剪出[224, 224, 3]的图片。
最后,随机对裁剪后的图片进行水平翻转
扩大了(256 - 224) ^2 * 2=2048倍
此处的平方是指,横着遍历行会有256-224个图片,纵着遍历列也会由256-224个图片,所以得用平方;进行水平翻转,一个变成两个图,所以*2。
②全连接层使用dropout方法
删除一些不太重要的神经元,就像生物学上的神经元,不会同时被激活,大部分会是派不上用场的。
pytorch实现
```python
import torch.nn as nn
class Alexnet(nn.Module):
def __init__(self):
super().__init__()
# 以下所有结构可放入nn.Sequential()里边,forward中直接执行一次即可
#输入图片大小为224*224*3
self.conv1 = nn.Conv2d(3,96,11,4,3) #输入通道3,输出通道48,卷积核为11*11,步长为4,宽高都填充三个值
self.relu1 = nn.ReLU()
#输入为55*55*96
self.p1 = nn.MaxPool2d(3,2) #池化核为3*3,步长为2
#输入为27*27*96
self.conv2 = nn.Conv2d(96,256,5,1,4)
self.relu2 = nn.ReLU()
#输入为27*27*256
self.p2 = nn.MaxPool2d(3,2)
#输入为13*13*256
self.conv3 = nn.Conv2d(256,384,3,1,2)
self.relu3 = nn.ReLU()
self.conv4 = nn.Conv2d(384,384,3,1,2)
self.relu4 = nn.ReLU()
self.conv5 = nn.Conv2d(384,256,3,1,2)
self.relu5 = nn.ReLU()
self.p3 = nn.MaxPool2d(3,2)
#输出图片大小为6*6*256=9216
#全连接层,输入为9216个神经元
self.fc1 = nn.Linear(9216,4096)
self.relu6 = nn.ReLU()
self.fc2 = nn.Linear(4096,4096)
self.relu7 = nn.ReLU()
self.fc3 = nn.Linear(4096,1000) #做1000分类,输出为1000个神经元
self.softmax = nn.Softmax()
#此函数用来执行网络模型
def forward(self,x):
x = self.conv1(x)
x = self.relu1(x)
x = self.p1(x)
x = self.conv2(x)
x = self.relu2(x)
x = self.p2(x)
x= self.conv3(x)
x = self.relu3(x)
x= self.conv4(x)
x = self.relu4(x)
x= self.conv5(x)
x = self.relu5(x)
x = self.p3(x)
x = self.fc1(x)
x = self.relu6(x)
x = self.fc2(x)
x = self.relu7(x)
x = self.fc3(x)
x = self.softmax(x)
return x
net = Alexnet()
**感谢各位的查看,希望能帮助到大家。**