使用深度卷积神经网络进行ImageNet图像分类
目录
2012年被认为是深度学习复兴之始,当时来自多伦多大学的Hinton(深度学习三巨头之一)和他的学生Alex Krizhevsky提出了一个名叫“AlexNet”的神经网络结构,该结构在当年的ImageNet LSVRC-2012竞赛一举夺冠,并以此开启了深度学习的热潮。
网络包含8个层:前5层为卷积层,后3层为全连接层,最后一个全连接层的输出被送到一个1000路的softmax分类器。
(最好跟着流程算一遍)
- #01:定义网络结构:在__init__构造函数中申明各个层的定义,在forward中实现层之间的连接关系
- class AlexNet(nn.Module):
- def __init__(self,num_classes):
- super().__init__()
- self.conv1=nn.Sequential(
- nn.Conv2d(in_channels=3, out_channels=96, kernel_size=11, stride=4, padding=0),
- nn.BatchNorm2d(96), #BN加在激活函数前面或后面
- nn.ReLU(inplace=True), #inplace=True将上层网络传递下来的tensor直接进行修改,来节省运算内寸
- nn.MaxPool2d(kernel_size=3, stride=2)
- )
- self.conv2=nn.Sequential(
- nn.Conv2d(in_channels=96, out_channels=256, kernel_size=5, stride=1,padding=2), nn.BatchNorm2d(256),
- nn.BatchNorm2d(256)
- nn.ReLU(inplace=True),
- nn.MaxPool2d(3,2)
- )
- self.conv3=nn.Sequential(
- nn.Conv2d(in_channels=256,out_channels=384,kernel_size=3,stride=1,padding=1),
- nn.BatchNorm2d(384),
- nn.ReLU(inplace=True)
- )
- self.conv4=nn.Sequential(
- nn.Conv2d(in_channels=384,out_channels=384,kernel_size=3,stride=1,padding=1),
- nn.BatchNorm2d(384),
- nn.ReLU(inplace=True)
- )
- self.conv5=nn.Sequential(
- nn.Conv2d(in_channels=384,out_channels=256,kernel_size=3,padding=1),
- nn.BatchNorm2d(256),
- nn.ReLU(inplace=True),
- nn.MaxPool2d(3,2)
- )
- self.fc=nn.Sequential(
- nn.Linear(in_features=9216,out_features=4096),
- nn.ReLU(inplace=True),
- nn.Dropout(0.5),
- nn.Linear(in_features=4096, out_features=4096),
- nn.ReLU(inplace=True),
- nn.Dropout(0.5),
- nn.Linear(in_features=4096, out_features=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=x.view(x.size(0),-1) #x=torch.flatten(x,start_dim=1)
- x=self.fc(x)
- return x
ReLU的收敛速度要快于sigmoid与tanh,因为后两者存在饱和区,在饱和区的梯度变化缓慢甚至出现梯度消失
单个GPU的内存限制了网络的训练规模,采用多GPU协同训练,可以大大提高AlexNet的训练速度。
举一个例子:
i = 10, N = 96 时,第 i=10 个卷积核在位置(x,y)处的取值为 ,它的局部响应归一化过程如下:用 除以第 8、9、10、11、12 片特征图位置(x,y)处的取值平方求和。
也就是跨通道的一个 Normalization 操作
局部响应归一化(local response normalization,LRN)的思想来源于生物学中的“侧抑制”,是某个神经元受到刺激而产生兴奋时,再刺激相近的神经元,则后者所发生的兴奋对前者产生的抑制作用。也就是说,侧抑制是指相邻的感受器之间能够互相抑制的现象。采用LRN的目的是为了将数据分布调整到合理的范围内,便于计算处理,从而提高泛化能力。
AlexNet 全部使用最大池化的方式,避免了平均池化所带来的模糊化的效果,并且步长 < 池化核的大小,这样一来池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。论文采用参数stride=2,kernelsize=3
此前的 CNN 一直使用平均池化的操作。
alexnet中采用两种数据增强的策略
即一张256x256的图像随机裁剪出224x224的图像有( 256 − 224 ) ∗ ( 256 − 224 ) 种可能,再做一次水平翻转则有( 256 − 224 ) ∗ ( 256 − 224 ) ∗ 2 = 2048 种可能
在测试时,网络通过提取5个224*224的块(四个角的图像块和中心的图像块)和他们的水平映射(因此总计10个图像块)来做预测,并将网络Softmax层在10个块上作的预测进行平均。
为RGB像素值的3x3协方差矩阵,是均值为0标准差为0.1的高斯扰动。个人推测应该是先对RGB图像resize成3x(256x256),归一化后根据协方差公式得到3x3矩阵,再利用奇异值分解得到特征值λ和特征向量p
alexnet在前两层全连接层前使用了dropout,以0.5的概率使得每个隐藏层的神经元输出0,既不参与前向传播,也不参与反向传播。这种方法弱化了神经元之间的依赖性。
1、【深度学习论文 01-1】AlexNet论文翻译 - 最菜程序员Sxx - 博客园
2、卷积神经网络超详细介绍_呆呆的猫的博客-CSDN博客_卷积神经网络
3、目标识别基础——alexnet模型(代码复现详解)_哔哩哔哩_bilibili
4、AlexNet 中的 LRN(Local Response Normalization) 是什么 - 知乎