当前位置: 首页 > article >正文

AlexNet论文代码阅读

论文标题: ImageNet Classification with Deep Convolutional Neural Networks
论文链接: https://volctracer.com/w/BX18q92F
代码链接: https://github.com/dansuh17/alexnet-pytorch

内容概述

训练了一个大型的深度卷积神经网络,将ImageNet LSVRC-2010竞赛中的120万张高分辨率图像分类到1000个不同的类别中。在测试数据上取得了37.5%的top-1错误率(top-1错误率是指其正确标签不是模型认为最可能的标签的比例)和17.0%的top-5错误率(其正确标签不是模型认为最可能的五个标签中的比例)。该神经网络包含6000万个参数和65万个神经元,由五个卷积层(其中一些后面跟着最大池化层)和三个全连接层组成,最后是一个1000路softmax。为了加快训练速度,使用了非饱和神经元和卷积运算的高效GPU实现。
网络结构图

一、架构

1.1多GPU训练

上图的网络架构图,分布在两个GPU中,只有第3层的卷积核是从第2层的所有卷积核映射中获取输入的,其他卷积核都只从同一GPU的卷积核映射中获取输入。两个GPU学习到的卷积核表现出不同的学习效果,这是受限连接性的结果。GPU1上的核在很大程度上与颜色无关,而GPU2上的核在很大程度上与颜色相关。
在这里插入图片描述

1.2使用ReLu

使用非饱和非线性激活函数(ReLU)替换了饱和非线性激活函数(tanh)加快训练。下图可以看出使用ReLu比tanh快几倍。
在这里插入图片描述

1.3局部响应归一化

局部归一化有助于该网络泛化。
局部响应归一化层加在了第一层和第二层卷积层后,最大池化层前。
b x , y i = a x , y i / ( k + α ∑ j = m a x ( 0 , i − n / 2 ) m i n ( N − 1 , i + n / 2 ) ( a x , y j ) 2 ) β b_{x,y}^i=a_{x,y}^i/(k+α\sum_{j=max(0,i-n/2)}^{min(N-1,i+n/2)}(a_{x,y}^j)^2)^β bx,yi=ax,yi/(k+αj=max(0,in/2)min(N1,i+n/2)(ax,yj)2)β
a x , y i a_{x,y}^i ax,yi表示在位置(x,y)应用核i后再应用ReLU非线性函数计算出的神经元活动。 b x , y i b_{x,y}^i bx,yi表示响应归一化活动。求和遍历再相同空间位置的n个相邻内核映射,N是该层中内核的总数。k,n,α,β是超参数,k=2,n=5,α=0.0001,β=0.75。

1.4 重叠池化

令kernel-size>stride达到重叠池化。

二、减少过拟合

2.1 数据增强

Ⅰ图像平移和水平翻转
通过从256 * 256图像中提取随机的224 * 224补丁,使训练集大小增加了2048倍—— ( 256 − 224 ) 2 ∗ 2 (256-224)^2 *2 (256224)22,测试时提取5个224 * 224的补丁(四个角补丁和中心补丁)及其水平反射(共十个补丁)来进行预测,并在网络的softmax层对十个补丁的预测进行平均。
Ⅱ 改变训练图像中的RGB通道的强度
在整个ImageNet训练集的RGB像素值集合上执行PCA。对于每个训练图像,找到其协方差矩阵的特征向量与特征值,计算 Δ I = [ p 1 , p 2 , p 3 ] [ α 1 λ 1 , α 2 λ 2 , α 3 λ 3 ] T \Delta I = [p_1,p_2,p_3][α_1λ_1,α_2λ_2,α_3λ_3]^T ΔI=[p1,p2,p3][α1λ1,α2λ2,α3λ3]T
其中 p i , λ i p_i,λ_i pi,λi是RGB像素值3x3协方差矩阵的第i个特征向量和特征值, α i α_i αi是从均值为零,标准差为0.1的高斯分布中抽取的随机变量。在每个RGB图像像素 I x y = [ I x y R , I x y G , I x y B ] I_{xy}=[I_{xy}^R,I_{xy}^G,I_{xy}^B] Ixy=[IxyR,IxyG,IxyB]中添加 Δ I \Delta I ΔI
该方案近似地捕捉了自然图像的一个重要属性,即物体身份对光照强度和颜色的变化是不变的。

2.2 dropout丢弃法

在前两个全连接隐藏层中使用了dropout,以0.5的概率将每个隐藏神经元的输出设置为零。在测试中,使用全部神经元,但将其输出乘以0.5。dropout会减少神经元对其他特定神经元的依赖。

三、网络的细节,

使用了momentum,动量为0.9,权重衰减为0.0005,批次大小为128。
学习率为0.01,学习率在训练过程中,随学习轮次变小。每次除以10,进行了大约90次循环。

四、结果

在这里插入图片描述
在ILSVRC-2012竞赛中表现如下:
在这里插入图片描述
在这里插入图片描述

五、定性评估

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

核心代码

self.net = nn.Sequential(
      nn.Conv2d(in_channels=3, out_channels=96, kernel_size=11, stride=4),  # (b x 96 x 55 x 55)
      nn.ReLU(),
      nn.LocalResponseNorm(size=5, alpha=0.0001, beta=0.75, k=2),  # section 3.3
      nn.MaxPool2d(kernel_size=3, stride=2),  # (b x 96 x 27 x 27)
      nn.Conv2d(96, 256, 5, padding=2),  # (b x 256 x 27 x 27)
      nn.ReLU(),
      nn.LocalResponseNorm(size=5, alpha=0.0001, beta=0.75, k=2),
      nn.MaxPool2d(kernel_size=3, stride=2),  # (b x 256 x 13 x 13)
      nn.Conv2d(256, 384, 3, padding=1),  # (b x 384 x 13 x 13)
      nn.ReLU(),
      nn.Conv2d(384, 384, 3, padding=1),  # (b x 384 x 13 x 13)
      nn.ReLU(),
      nn.Conv2d(384, 256, 3, padding=1),  # (b x 256 x 13 x 13)
      nn.ReLU(),
      nn.MaxPool2d(kernel_size=3, stride=2),  # (b x 256 x 6 x 6)
  )
  # classifier is just a name for linear layers
  self.classifier = nn.Sequential(
      nn.Dropout(p=0.5, inplace=True),
      nn.Linear(in_features=(256 * 6 * 6), out_features=4096),
      nn.ReLU(),
      nn.Dropout(p=0.5, inplace=True),
      nn.Linear(in_features=4096, out_features=4096),
      nn.ReLU(),
      nn.Linear(in_features=4096, out_features=num_classes),
  )
  self.init_bias()  # initialize bias

  def init_bias(self):
      for layer in self.net:
          if isinstance(layer, nn.Conv2d):
              nn.init.normal_(layer.weight, mean=0, std=0.01)
              nn.init.constant_(layer.bias, 0)
      # original paper = 1 for Conv2d layers 2nd, 4th, and 5th conv layers
      nn.init.constant_(self.net[4].bias, 1)
      nn.init.constant_(self.net[10].bias, 1)
      nn.init.constant_(self.net[12].bias, 1)

http://www.kler.cn/a/530335.html

相关文章:

  • 在CentOS服务器上部署DeepSeek R1
  • Workbench 中的热源仿真
  • 力扣第149场双周赛
  • vue入门到实战 二
  • MySQL基础-多表查询
  • 计算机网络一点事(23)
  • OpenAI发布最新推理模型o3-mini
  • 1. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--前言
  • Nginx开发01:基础配置
  • AI模型平台之——ModelScope(魔搭)
  • 面试题-消失的数字-异或
  • 线性回归的损失和优化02
  • 小红的合数寻找
  • DeepSeek 详细使用教程
  • 笔灵ai写作技术浅析(三):深度学习
  • 携程Java开发面试题及参考答案 (200道-上)
  • 深度学习 DAY3:NLP发展史(全网最全)
  • 【Windows7和Windows10下从零搭建Qt+Leaflet开发环境】
  • doris:主键模型的更新并发控制
  • css三角图标
  • Linux的循环,bash的循环
  • 开源模型应用落地-DeepSeek-R1-Distill-Qwen-7B与vllm实现推理加速的正确姿势(一)
  • 【C语言】结构体对齐规则
  • MySQL是怎么实现事务隔离的?
  • [权限提升] Windows 提权 维持 — 系统错误配置提权 - PATH 环境变量提权
  • Linux环境下测试服务器的DDR5内存性能