使用pytorch搭建自己的网络之AlexNet

一、introduction

回顾近几年来卷积神经网络的发展历史,我们必须要提到AlexNet卷积神经网络。这是Alex在2012年提出来的神经网络模型,赢得了当年的图像识别大赛冠军,首次证明了通过网络学习到的特征可以超越手工设计的特征,同时也奠定了CNN在处理图像分类任务上的地位。

二、网络结构

使用pytorch搭建自己的网络之AlexNet_第1张图片
网上比较流行的网络结构如上图所示,由于当年计算能力的不足,AlexNet网络在训练时使用了两块GPU同时进行训练;随着现在硬件能力的提升,我们使用一块普通的GPU已经能够很快速地训练该网络。

具体代码如下:

import torch
from torch import nn

in_channels = 3
num_classes = 10

class AlexNet(nn.Module):
    def __init__(self):
        super(AlexNet, self).__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(in_channels, 96, 11, 4),  # in_channels, out_channels, kernel_size, stride, padding
            nn.ReLU(),
            nn.MaxPool2d(3, 2),   # kernel_size, stride
            #减少卷积窗口,使用填充为2来使输入输出大小一致
            nn.Conv2d(96, 256, 5, 1, 2),
            nn.ReLU(),
            nn.MaxPool2d(3, 2),
            #下面接三个卷积层
            nn.Conv2d(256, 384, 3, 1, 1),
            nn.ReLU(),
            nn.Conv2d(384, 384, 3, 1, 1),
            nn.ReLU(),
            nn.Conv2d(384, 256, 3, 1, 1),
            nn.ReLU(),
            nn.MaxPool2d(3, 2)
        )
        self.fc = nn.Sequential(
            nn.Linear(256*5*5, 4096),
            nn.Dropout(0.5),
            nn.Linear(4096, 4096),
            nn.ReLU(),
            nn.Dropout(0.5),
            nn.Linear(4096, num_classes),
        )
    def forward(self, img):
        feature = self.conv(img)
        output = self.fc(feature.view(img.shape[0], -1))
        return output

if __name__ == '__main__':
    net=AlexNet()
    print(net)

其网络结构非常简单,主要由五个卷积层、三个最大池化层和三个全连接层组成。
使用pytorch搭建自己的网络之AlexNet_第2张图片

三、创新点

在AlexNet网络设计部分,其中的创新点如下所示,虽然在现在看来有些方法已经不再使用,但是其思想值得我们学习和借鉴。
1、使用了ReLU()激活函数,能够解决sigmoid在训练较深的网络中出现的梯度消失问题。
2、使用Dropout随机忽略一些神经元,以避免过拟合。
3、使用多块GPU同时进行训练,开创了GPU训练神经网络的先河。

你可能感兴趣的:(pytorch,神经网络,pytorch)