机器学习笔记--卷积神经网络之AlexNet

前言

2012年,AlexNet横空出世,这个模型的名字来源于论文第一作者的姓名Alex Krizhevsky。AlexNet 使⽤了 8 层卷积神经⽹络,并以很⼤的优势赢得了 ImageNet 2012 图像识别挑战赛冠军。

1 AlexNet网络结构

Alexnet模型由5个卷积层和3个池化Pooling 层 ,其中还有3个全连接层构成。AlexNet 跟 LeNet 结构类似,但使⽤了更多的卷积层和更⼤的参数空间来拟合⼤规模数据集 ImageNet。它是浅层神经⽹络和深度神经⽹络的分界线。

机器学习笔记--卷积神经网络之AlexNet_第1张图片

AlexNet主要使用到的新技术点如下:

  • 成功使用ReLU作为CNN的激活函数,并验证其效果载较深的网络超过了sigmoid,成功解决了sigmoid在网络较深时的梯度弥散问题。
  • 训练时使用Dropout随机忽略一部分神经元,以避免模型过拟合。
  • 在CNN中使用重叠的最大池化。
  • 提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
  • 使用CUDA加速深度卷积网络的训练
  • 数据增强

机器学习笔记--卷积神经网络之AlexNet_第2张图片

pytorch搭建:

import torch
import torch.nn as nn

num_classes =1000
#搭建八层的AlexNet网络模型
class AlexNet(nn.Module):
    def __init__(self):
        super(AlexNet, self).__init__()
        '''
        nn.Sequential是一个Sequential容器,模块将按照构造函数中传递的顺序添加到模块中
        '''
        self.conv1= nn.Sequential(
            nn.Conv2d(in_channels=3,out_channels=96,kernel_size=11,stride=4),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3,stride=2),
            #没有做LRN,因为LRN已被证明在提高模型的泛化能力上效果微乎其微
        )
        self.conv2 = nn.Sequential(
            nn.Conv2d(in_channels=96,out_channels=256,kernel_size=5,stride=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3,stride=2)
        )
        self.conv3 = nn.Sequential(
            nn.Conv2d(in_channels=256,out_channels=384,kernel_size=3,stride=1),
            nn.ReLU(inplace=True)
        )
        self.conv4 = nn.Sequential(
            nn.Conv2d(in_channels=384,out_channels=384,kernel_size=3,stride=1),
            nn.ReLU(inplace=True)
        )
        self.conv5 = nn.Sequential(
            nn.Conv2d(in_channels=384,out_channels=256,kernel_size=3,stride=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3,stride=2)
        )
        self.fc1 = nn.Sequential(
            nn.Linear(6*6*256,4096),
            nn.ReLU(inplace=True),
            nn.Dropout()
        )
        self.fc2 = nn.Sequential(
            nn.Linear(4096,4096),
            nn.Dropout()
        )
        self.fc3 = nn.Sequential(
            # nn.Linear(4096,1000)
            nn.Linear(4096,num_classes)
        )

    def forward(self,x):
        x=self.conv1(x)
        x = self.conv2(x)
        x = self.conv3(x)
        x = self.conv4(x)
        x = self.conv5(x)
        x = torch.flatten(x,start_dim=1)
        x = self.fc1(x)
        x = self.fc2(x)
        x = self.fc3(x)
        return x

if  __name__ =="__main__":
    model = AlexNet()
    print(model)

参考资料:

卷积神经网络之Alexnet - 知乎 

[PyTorch]AlexNet代码复现_Le0v1n的博客-CSDN博客

你可能感兴趣的:(笔记,机器学习,基础知识,cnn,深度学习,神经网络)