AlexNet详解及pytorch实现

介绍

AlexNet是一个网络层数较多的模型,也就是一个很深的模型,在2012年的ImageNet比赛中大放异彩,算是一个深模型的开端。
在这里插入图片描述
参数量在逐层的增加
在这里插入图片描述
从下边这个图可以看出来,输入是224*224大小的,5个卷积层,两个全连接层,输出是1000分类

优点

AlexNet相比之前的一些卷积神经网络模型有了一些改进,也才能取得一定的成就。改进也主要是4方面:

  1. 使用ReLU函数做激活函数
    在这里插入图片描述
    此图为ReLU函数图像
    ReLU函数(也叫斜坡函数)是一个很简单的函数,使得模型训练速度会很快,导数值很稳定,也能够很有效的进行梯度下降和反向传播,避免梯度消失。

  2. 使用分布式GPU计算(是提出GPU训练模型的先驱)
    在这里插入图片描述
    GPU训练可以加快训练速度,GPU内存很大。

  3. 加入LRN(局部响应归一化Local Response Normalization)
    在这里插入图片描述
    其中a表示经过激活函数的卷积特征图,N表示卷积之后的特征图数量,n表示近邻的特征图数量。k、α、β、n/2均为超参数,通常k=2, α=1e-4, β=0.75、n=5。

其实就是把一个像素点同它上下的n个特征图相同位置的像素点做处理,用到别的特征图的信息,和归一化处理很相似。

  1. 使用重叠池化
    在这里插入图片描述
    池化核大小大于步长
    能多次提取重要特征,重复利用,防止重要特征被遗漏掉

  2. 正则化方法
    ①数据集增强
    样本缩放和裁剪,先将样本缩小,然后逐步的取一小块区域,然后对图片进行水平翻转
    例如:
    首先,将图片等比缩放,使得最小边缩放为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()




**感谢各位的查看,希望能帮助到大家。**
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值