一、Alexnet是什么?
AlexNet是一种深度卷积神经网络,由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton在2012年提出。发表在NIPS,论文名为《ImageNet Classification with Deep Convolutional Neural Networks》,论文见:http://www.cs.toronto.edu/~hinton/absps/imagenet.pdf .
它被广泛应用于计算机视觉领域的图像分类任务, 它是第一个在ImageNet大规模图像识别挑战赛上取得显著成功的深度学习模型。
二、Alexnet的结构
图中包含了GPU通信的部分。这是由当时GPU受限制引起的,作者使用两块GPU进行计算,因此分为上下两部分.
AlexNet是一种深度学习网络模型,用于图像分类任务。在该模型中,为了增加数据的多样性和丰富性,在输入网络之前,从256×256大小的图像中随机裁剪出227×227大小的图像作为输入。原本论文中提到的输入尺寸为224×224是一个错误,正确的输入尺寸应为227×227。
整体结构由5个卷积层(Convolution、ReLU、LRN、Pooling)+3个全连接层组成.
1. 输入层(Input):图像大小227*227*3.
2. 第一个卷积层C1: 使用96个11*11的filter,stride为4,padding为0,卷积层后跟ReLU,因此输出的尺寸为 (227-11)/4+1=55,因此其输出的每个特征图 为 55*55*96
训练参数为 (11*11*3*96)+96=34944 同时后面经过LRN层处理,尺寸不变.
3.最大池化层:filter为3*3,stride为2,padding为0,输出为27*27*96,96个feature maps
4.第二个卷积层C2 : 使用256个5*5的filter,stride为1,padding为2,输出为27*27*256,256个feature maps,训练参数(5*5*96*256)+256=614656。
5..最大池化层:filter为3*3,stride为2,padding为0,输出为13*13*256,256个feature maps。
6. 第三个卷积层C3+ReLU:使用384个3*3的filter,stride为1,padding为1,输出为13*13*384,384个feature maps,训练参数(3*3*256*384)+384=885120。
7. 第四个卷积层C4+ReLU:使用384个3*3的filter,stride为1,padding为1,输出为13*13*384,384个feature maps,训练参数(3*3*384*384)+384=1327488。
8. 第五个卷积层C5+ReLU:使用256个3*3的filter,stride为1,padding为1,输出为13*13*256,256个feature maps,训练参数(3*3*384*256)+256=884992。
9. 最大池化层:filter为3*3,stride为2,padding为0,输出为6*6*256,256个feature maps。
10. 全连接层1+ReLU+Dropout:有4096个神经元,训练参数(6*6*256)*4096=37748736。
11. 全连接层2+ReLU+Dropout:有4096个神经元,训练参数4096*4096=16777216。
12. 全连接层3:有1000个神经元,训练参数4096*1000=4096000。
13. 输出层(Softmax):输出识别结果,看它究竟是1000个可能类别中的哪一个。
predict可视化结果如下:
三、AlexNet的特点
-
深层结构创新:AlexNet引入了一个较深的网络结构,相比于以往的浅层网络,它的8个卷积层和3个全连接层有助于提取更多层次的抽象特征。这种深度结构使得模型能够更好地捕捉图像中的复杂关系,从而提高了图像分类的准确性。
-
ReLU激活函数:使用修正线性单元(Rectified Linear Unit, ReLU)作为激活函数是AlexNet的另一个重要特点。相较于传统的sigmoid或tanh函数,ReLU函数具有非线性变换的能力,并且计算速度更快。这使得AlexNet能够更快地收敛并学习到更好的特征表示。同时,ReLU有效防止了过拟合现象的出现.
-
Dropout正则化:为了避免过拟合,AlexNet引入了Dropout技术。在训练期间,Dropout会随机将一定比例的神经元输出置为0,从而减少神经元之间的依赖性,提高模型的泛化能力。
-
数据增强:AlexNet通过对训练样本进行一系列的数据增强操作,如随机翻转、裁剪、旋转等,扩展了训练集。这样做可以增加数据的多样性和数量,减轻过拟合问题,并提高模型的鲁棒性。
-
GPU加速:AlexNet是第一个充分利用GPU并行计算能力的深度卷积神经网络模型。通过在两个GPU上进行并行计算,它极大地加快了模型的训练速度。这项创新使得训练大规模深度模型成为可能,为后续的深度学习研究铺平了道路。
总结来说,AlexNet的主要贡献在于引入了深层结构、ReLU激活函数、Dropout正则化和数据增强等技术,这些创新为深度学习的发展开辟了道路,并在计算机视觉任务中取得了突破性的进展。
四、Pytorch代码实现
import torch
from torch import nn
import d2lzh_pytorch as d2l
class AlexNet(nn.Module):
def __init__(self):
super(AlexNet,self).__init__()
self.conv=nn.Sequential(
nn.Conv2d(in_channels=1,out_channels=96,kernel_size=11,stride=4),
nn.ReLU(),
nn.MaxPool2d(3,2),
nn.Conv2d(in_channels=96,out_channels=256,kernel_size=5,stride=1,padding=2),
nn.ReLU(),
nn.MaxPool2d(3,2),
nn.Conv2d(in_channels=256,out_channels=384,kernel_size=3,stride=1,padding=1),
nn.ReLU(),
nn.Conv2d(in_channels=384,out_channels=384,kernel_size=3,stride=1,padding=1),
nn.ReLU(),
nn.Conv2d(in_channels=384,out_channels=256,kernel_size=3,stride=1,padding=1),
nn.ReLU(),
nn.MaxPool2d(3,2)
)
self.fc=nn.Sequential(
nn.Linear(5*5*256,4096),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(4096,4096),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(4096,10)
)
def forward(self,img):
feature=self.conv(img)
output=self.fc(feature.view(img.shape[0],-1))
return output
net=AlexNet()
print(net)
五、AlexNet的优缺点
AlexNet在深度学习的发展中有许多优点和一些缺点。以下是其主要的优点和缺点:
优点:
-
准确性:AlexNet在当时的ImageNet图像分类挑战赛上取得了显著的准确率提升,大幅领先于其他竞争模型。它的深层结构和创新技术(如ReLU激活函数、LRN、Dropout等)使得其在图像分类任务上具有出色的性能。
-
特征提取能力:通过多个卷积层和池化层的组合,AlexNet能够有效地提取多层次的抽象特征。这种能力使得它在处理复杂图像数据时表现出色,并为后续的深度学习模型奠定了基础。
-
并行计算加速:AlexNet是首个充分利用GPU并行计算能力的深度学习模型。通过在两个GPU上进行并行计算,它极大地加快了模型的训练速度,为大规模深度模型的训练提供了可行性。
-
数据增强和正则化:AlexNet引入了数据增强和正则化技术,如随机翻转、裁剪、旋转、LRN和Dropout等。这些技术有助于增加数据的多样性和数量,减轻过拟合问题,并提高模型的泛化能力。
缺点:
-
较大的计算资源需求:AlexNet是一个较深、复杂的模型,需要大量的计算资源和训练时间进行训练。这对于一些资源受限的环境可能会造成挑战。
-
参数量较大:AlexNet具有较大的模型参数量,这使得它需要更多的存储空间和计算资源来进行训练和推理。在一些轻量级设备上应用时可能面临性能和资源消耗方面的限制。
-
容易过拟合:由于模型的复杂性和参数量较大,AlexNet容易在小规模数据集上出现过拟合的问题。为了解决这个问题,需要使用正则化技术如Dropout等来减少过拟合的风险。
-
局限性:尽管AlexNet在图像分类任务上取得了巨大成功,但它在其他计算机视觉任务(如目标检测、语义分割等)上的应用相对有限。新的网络架构和技术被提出来解决这些任务,并取得了更好的效果。
尽管存在一些缺点,AlexNet作为深度学习发展的里程碑,为后续的研究和模型设计提供了宝贵的经验和启示。它对于推动深度学习在计算机视觉领域的发展做出了重要贡献。
六、疑惑
LRN是什么?
在AlexNet中,LRN(Local Response Normalization)是一种局部响应归一化的技术。它是在卷积层之后的一个操作。
具体而言,LRN操作会对每个卷积层的输出进行处理。对于每个特征图上的每个位置,LRN都会计算一个归一化因子。这个归一化因子取决于该位置的神经元以及相邻位置的神经元输出的平方和。然后,将该位置的神经元的输出除以该归一化因子,以实现局部响应归一化。
通过引入LRN层,AlexNet可以提供以下好处:
-
增强模型的鲁棒性:LRN可以抑制较大响应值的神经元,使模型对输入中的较大变化不敏感。这有助于提高模型的鲁棒性,使其能够更好地处理不同大小、光照等方面的变化。
-
提高泛化能力:通过进行局部响应归一化,LRN可以增强神经元之间的竞争关系。这有助于防止某些神经元占据主导地位,使其他神经元也有机会参与到特征表示中,从而提高模型的泛化能力。
需要注意的是,随着深度学习的发展,LRN逐渐被更有效的归一化方法如BN(Batch Normalization)所取代。因为相比于LRN,BN具有更好的归一化效果,并且不受窗口大小的影响。所以在现代的深度学习模型中,LRN的使用已经相对较少。
在AlexNet中的公式如下:
参数说明:需要手动设置的超参为(k,α,β,n)
- i 表示第 i 个通道
- x, y 表示要进行归一化的这个值的位置坐标
- k 的作用是防止发生除0的情况
- α 和 β 为常数
- n 表示邻域的范围,边界情况用0补齐
参考:AlexNet网络结构详解(含各层维度大小计算过程)与PyTorch实现_alexnet架构_K24B;的博客-CSDN博客
【精选】经典卷积神经网络--AlexNet的详解_无尽的沉默的博客-CSDN博客