回顾近几年来卷积神经网络的发展历史,我们必须要提到AlexNet卷积神经网络。这是Alex在2012年提出来的神经网络模型,赢得了当年的图像识别大赛冠军,首次证明了通过网络学习到的特征可以超越手工设计的特征,同时也奠定了CNN在处理图像分类任务上的地位。
网上比较流行的网络结构如上图所示,由于当年计算能力的不足,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)
其网络结构非常简单,主要由五个卷积层、三个最大池化层和三个全连接层组成。
在AlexNet网络设计部分,其中的创新点如下所示,虽然在现在看来有些方法已经不再使用,但是其思想值得我们学习和借鉴。
1、使用了ReLU()激活函数,能够解决sigmoid在训练较深的网络中出现的梯度消失问题。
2、使用Dropout随机忽略一些神经元,以避免过拟合。
3、使用多块GPU同时进行训练,开创了GPU训练神经网络的先河。