1.5.1 AlexNet

2023-11-03

五、AlexNet

AlexNet 是 2012 年第 3届 ILSVRC(ImageNet Large Scale Visual Recognition Comprtition)图像分类任务中的冠军模型,伴随着比赛的成功,这篇发表在 NIPS(Neural Information Processing Systems) 上的论文1截止目前已有超过 4.5 万次引用量,是学习深度学习尤其是 CNN 网络架构中必读的论文之一。AlexNet 以 15.3% 的误差率大差距碾压亚冠团队,由此开启了 CNN 在图像分类任务中的霸主地位。下图 1 是前 6 名的误识别率排名,第一名为 SuperVision 团队,即 AlexNet 模型。
【图 1】

5.1 ReLU 激活函数

在这之前,神经网络通常使用 t a n h tanh tanh 激活函数或者 S i g m o i d Sigmoid Sigmoid 激活函数,从本质上讲, t a n h tanh tanh S i g m o i d Sigmoid Sigmoid 都是 “S” 型激活函数,在反向传播计算过程中都难免达到饱和状态,导致严重的梯度消失问题。据此,这里引入可一种称之为修正线性单元的激活函数,即 ReLU(Rectified Linear Units),其表达式为 f ( x ) = max ⁡ ( 0 , x ) f(x)=\max(0, x) f(x)=max(0,x),三者的函数曲线图及导数曲线图如下图所示:
【图 2】
【图 3】

由于 ReLU 激活函数本身并不是可微分函数,为了计算便利,我们强制性定义在 0 处的微分值为 0。根据图 2,我们可以看到,当激活值趋近于 1, t a n h tanh tanh s i g m o i d sigmoid sigmoid 函数的导数值迅速趋于平缓接近于 0,而 ReLU 的导数却随着激活值的增大而增大,这很大程度上缓解了梯度消失的问题,也加速了网络的训练速度。图 3 展示了一个四层卷积网络在 CIFAR-10 数据集上同样当训练误差达到 25% 时,ReLU 激活函数比 t a n h tanh tanh 激活函数快了 6 倍。(然而,在该数据集上实测发现 t a n h tanh tanh 与 ReLU 效果相差不大,甚至 t a n h tanh tanh 比 ReLU 略好,但总比均比 s i g m o i d sigmoid sigmoid 好很多。)
【图 4】

5.2 局部响应正则化

【图 5】

局部响应正则化(Local Response Normalization, LRN)是一种局部正则化技术,在 AlexNet 中,作者指出应用该技术可以在 top-1 和 top-5 误差率上分别降低 1.4% 和 1.2%。其理念来自于神经生物学中的侧抑制(lateral inhibitio)概念,侧抑制是指在某个神经元受到刺激而产生兴奋时,再刺激相近的神经元,则后者所发生的兴奋对前者产生的抑制作用。也就是说,侧抑制是指相邻的感受器之间能够互相抑制的现象。2而在 LRN 中,这种邻近神经元体现在不同通道的特征图上。具体的计算公式如下:

(1) b x , y i = a x , y i / ( k + α ∑ j = max ⁡ ( 0 , i − n / 2 ) min ⁡ ( N − 1 , i + n / 2 ) ( a x , j j ) 2 ) β b^i_{x,y}=a^i_{x, y}/\left(k+\alpha\sum^{\min (N-1, i+n/2)}_{j=\max(0,i-n/2)}(a^j_{x,j})^2\right)^{\beta} \tag{1} bx,yi=ax,yi/k+αj=max(0,in/2)min(N1,i+n/2)(ax,jj)2β(1)

其中 a x , y i a^i_{x,y} ax,yi 是第 i i i 个特征通道 x , y x,y x,y 位置的值, b x , y i b^i_{x,y} bx,yi 是该通道经过 LRN 技术后的新值, N N N 是指通道数,即卷积核的数量, k , α , β , n k, \alpha, \beta, n k,α,β,n 均是超参数, n n n 为深度半径,控制邻近神经元的抑制范围, k k k 是为了防止除数为 0 添加的偏置项, α , β \alpha, \beta α,β 控制彼此抑制程度。该计算的直观理解可参照图 4。

import tensorflow as tf
import numpy as np
import random

x = np.array([random.randint(1, 100) for _ in range(40)]).reshape([2,2,2,5])
y = tf.nn.local_response_normalization(
    x,
    depth_radius=5,
    bias=2,
    alpha=10e-4,
    beta=0.75
)

with tf.Session() as sess:
    print(x)
    print(y.eval())
[[[[ 17  62  52  75  32]
   [ 46  57  11  80  49]]

  [[ 38  47  41  69   6]
   [ 32  27  36  69  61]]]


 [[[ 57  40  48  27 100]
   [ 90  85  45  37  82]]

  [[ 52  44  32  64  30]
   [ 57   2   9  54  93]]]]
[[[[ 2.1776824   7.942136    6.661146    9.607422    4.099167  ]
   [ 5.673838    7.030626    1.3567874   9.867545    6.0438714 ]]

  [[ 5.846031    7.2306175   6.30756    10.615162    0.92305756]
   [ 4.535786    3.8270695   5.1027594   9.780289    8.646342  ]]]


 [[[ 6.0538244   4.2482977   5.0979576   2.867601   10.620745  ]
   [ 7.5061765   7.0891666   3.7530882   3.0858727   6.838961  ]]

  [[ 7.747794    6.5558257   4.7678733   9.535747    4.469881  ]
   [ 6.8387866   0.23995742  1.0798084   6.4788504  11.15802   ]]]]

该技术在网络发展的后期使用较少,逐渐被 Batch Normalization(BN) 等其他技术取代。

5.3 数据增强

数据增强是一种很实用的通过增大数据集以缓解过拟合的低成本技术。数据增强主要通过一些诸如图片平移、镜像翻转、倾斜、扭曲以及裁剪、通道变化等手段对原始数据集进行扩张。

另外,作者还提出了中通过调整图片 RGB 各颜色通道的光照强度,近似模拟自然图像的一个重要特性,即光照的颜色和强度发生变化时,目标本身不变。

需要注意的是,数据增强只发生在训练阶段、验证集和测试集不需要数据增强。

import tensorflow as tf
from tensorflow.keras.preprocessing import image
import matplotlib.pyplot as plt
datagen = image.ImageDataGenerator(rotation_range=40,
      width_shift_range=0.2,
      height_shift_range=0.2,
      shear_range=0.2,
      zoom_range=0.2,
      horizontal_flip=True,
      fill_mode='nearest')

img = image.load_img("demo.jpg")

x = image.img_to_array(img)
x = x.reshape((1,) + x.shape)

results = np.zeros((4*441+15, 4*700+15, 3), dtype=np.int32)
for i in range(4):  # iterate over the rows of our results grid
    for j in range(4):  # iterate over the columns of our results grid
        horizontal_start = i * 441 + i * 5
        horizontal_end = horizontal_start + 441
        vertical_start = j * 700 + j * 5
        vertical_end = vertical_start + 700
        results[horizontal_start: horizontal_end, vertical_start: vertical_end, :] = datagen.flow(x, batch_size=1)[0][0]

plt.figure(figsize=(20, 20))
plt.imshow(results)

【图 6】

5.4 Dropout

Dropout 是另一种非常有效的降低过拟合风险的策略。作者 Geoffrey HInton 提到,他是受到了银行中防欺诈的启发而发明的3

我去银行的时候经常发现柜员一直在换,我询问了这么做的原因,但却没人知道。后来我想明白了,如果想要成功地进行银行欺诈往往需要内部员工的配合,这使我意识到如果对每个样本随机丢弃一部分不同的神经元,这样就能阻止“阴谋”的发生,进而减少过拟合。

【图 7】

Dropout 的核心思想就是在训练阶段,每一批量的训练样本上,网络都会以一定的概率随机丢弃一部分神经元,被丢弃的神经元实际输入与输出值均为 0,如上图所示。这样实际整个训练过程中,学习到了很多不同的网络架构,但是不同网络间的权重是共享的,这有点类似于组合机器学习策略。然而这样的策略并没有严谨的数学证明其理论的精准性,但是却是工程实践上很成功的策略。因此 Dropout 也有其较为直观的理解方式。通过 Dropout 随机丢弃部分神经元,可以打破神经元之间复杂的相互适应性,迫使每个神经元都去学习更加鲁棒的特征。如同在工作中,一项工作的进行不会因为某个人的请假、离职而中断,而是由替代者接替,这样可以迫使每个员工都可以学到更多的内容,也不会形成相互适应性,例如某些员工只负责某些事情,而某些员工即使消极怠工也不会影响正常工作。

假设网络以 p = 0.5 p=0.5 p=0.5 的概率随机丢弃网络中神经元,在测试阶段,我们需要“组合”网络,即在测试阶段不使用 Dropout,然而直观上测试阶段不使用 Dropout 的网络规模是训练阶段使用 Dropout 网络规模的二倍,因此,在测试阶段网络的输出需要除以 2.

由于 Dropout 技术直观上可以打破神经元之间的弱连接关系,强迫神经元学习强连接,因此它不仅可以学到更鲁棒的特征,提高泛化能力,而且也提高了反向传播的计算效率,加快网络收敛速度。

5.5 网络整体架构

【图 7】

网络在训练过程中使用了 2 块 GPU,因此网络架构中中间部分出现了 2 个完全一致的分支,然而作者指出,之所以使用 2 块 GPU,主要是解决显存不足的问题,本质上并没有加速网络的训练速度(尽管快了一点)。

【图 8】

CaffeNet 是单 GPU 版的 AlexNet,具体网络架构如图 8 所示。
AlexNet 网络结构如下表所示:

模块 卷积层 池化、正则
CONV1 [11×11 ~ 4 | 3→96] MAXPOOL[3×3 ~ 2]→LRN
CONV2 [5×5 ~ 1 | 96→256] MAXPOOL[3×3 ~ 2]→LRN
CONV3 [3×3 ~ 1 | 256→384] →LRN
CONV4 [3×3 ~ 1 | 384→384] →LRN
CONV5 [3×3 ~ 1 | 384→256] MAXPOOL[3×3 ~ 2]→LRN
FC1 [12544→4096] DROPOUT 50%
FC2 [4096→4096] DROPOUT 50%
Softmax [4096→1000]

5.6 小结

AlexNet 的成功从真正意义上点燃了深度学习这把尘封已久的火炬,其技术实现上也取得非常大的突破。例如 ReLU 激活函数的成功运用,数据增强,Dropout 等降低过拟合风险的策略,如今这些技巧已成为深度学习中的标配组件。然而随着技术的进步,也有许多技术逐步被新技术取代或进一步改进,以寻求更强大的性能。

  • GPU 加速,现在主流机器学习框架如 TensoFlow 等完全支持 GPU 以及 TPU 硬件加速,甚至支持多机多卡分布式训练策略,极大的加快网络训练速度;
  • LRN 技术目前已基本被 BN 技术取代;
  • 在本文中的池化原指重叠池化(Overlapping Pooling),目前一般采用常规 Max-Pooling。
  • 在数据增强过程中,作者给出的第一种增强思路是从原图的四个角落及中心位置截取图片并通过水平翻转获得 10 张 224 × 224 224 \times 224 224×224 的子图,该图像的预测结果值为这 10 张子图的 softmax 输出层结果的平均值。而目前的数据增强是完全增强,作为独立图片使用。

  1. ImageNet Classification with Deep Convolutional Neural Networks ↩︎

  2. https://baike.baidu.com/item/%E4%BE%A7%E6%8A%91%E5%88%B6 ↩︎

  3. https://jovianlin.io/the-idea-behind-dropout/ ↩︎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1.5.1 AlexNet 的相关文章

随机推荐

  • MQTT遗愿(last will) paho.mqtt实现

    一 MQTT遗嘱 MQTT 可以设置遗嘱 客户端在连接Broker的时候将遗嘱内容 也是topic payload形式 遗嘱也有一个主题 发送给Broker并保存在Broker中 当客户端因为非正常原因断开与Broker的连接时 Broke
  • 进程的相概念(linux系统编程)

    什么是程序 什么是进程 有什么区别 程序是静态的概念 gcc xx x o pro 磁盘中生成的pro就是程序 进程是程序的一次运行活动 通俗的讲就是程序跑起来了 系统中就多了一个进程 在Linux里面怎么查看系统中有哪些进程 使用ps指令
  • linux的超级管理用户

    超级管理用户 也称为root用户 是Linux系统中最高权限用户 root用户具有完全控制系统的权限 可以执行任何操作 包括管理文件 修改配置 安装软件等 下面是root用户的用法大全 切换到root用户 在终端中输入以下命令 su roo
  • 青龙面板使用教程,以及安装

    1 青龙面板使用教程 以及安装 首先青龙面板是在docker里面的 我们要安装一个docker 我这里只有debian 11 安装的教程 如何在debian11上安装docker 知乎 这个文章不错了 按命令执行就好了 其他操作系统的 去网
  • K8S-11--prometheus--(监控基础/prometheus基础/grafana/promQL/exporter/cadvisor)

    一 监控基础 一 监控简介 监控模型 端监控 业务层监控 应用层监控 中间件监控 系统层监控 1 监控概述 web监控 打开速度 URL打开状态码 API接口可用性 业务监控 订单交易量 活跃用户量 支付量 中间件监控 数据库 redis
  • 跳出ping++退款的坑

    近期在项目的开发过程中 需要用到ping 的退款功能 由于使用的版本比官方提供的要低2个小版本 因此问题并不是很大 但是由于官方文档有些内容写的比较含蓄 因此遇到了一些问题 我们可以通过如下的方式来获取SDK的版本 gt gt gt imp
  • STM32开发环境配置相关问题记录

    1 编译时出现 error 35 error directive Please select first the target STM32F10x device used 解决方案 点选options for target 选择C C 在d
  • K8S deployment挂载

    Deployment部署文件 apiVersion apps v1 kind Deployment metadata annotations deployment kubernetes io revision 1 kubectl kuber
  • Spring Security认证成功后回跳(解决前后端分离下OAuth2认证成功回跳)

    前言 Spring Security 后面简称SS 用了很长时间了 但之前一直没注意到一个有趣的特性 直到最近弄前后端分离 在OAuth2提供者 github 认证后 需要跳回前端页面 前端页面和服务端不在同个域下 然后突然一般情况下 同域
  • 鸿蒙系统做服务器,鸿蒙升级第一夜服务器崩了,有人等到凌晨3点,称升级后内存变大...

    编 赵艳秋 6月2日晚间 华为宣布推出HarmonyOS 2 华为 百 款设备将陆续启动HarmonyOS 2升级 不少华为用户则经历了艰难的一夜 最大规模升级第一夜服务器崩了 有如五一小长假期间的在线购票系统12306 6月2日晚 因为太
  • 半径为r的均匀带电球体_放于真空中半径为R,带电量为q的均匀带电球体,求球内外各点电势分布...

    展开全部 当半径r 一个均匀带电的球壳 带电量为q 则e68a84e8a2ad62616964757a686964616f31333431353338对壳外部产生的场强为E q 4 r 内部场强为零 则以上均匀带电的球内半径为r处 电场强度
  • C语言删除字符串中某一指定字符

    include
  • Python数据挖掘和解析算法

    机器学习是计算机科学的一个分支 它利用过去的经验来学习并利用其知识来做出未来的决策 机器学习是计算机科学 工程和统计学的交叉点 机器学习的目标是概括一个可检测的模式或从给定的例子中创建一个未知的规则 机器学习领域的概述如下 监督学习 这是教
  • 11.3外汇黄金价格投资策略、期货原油最新价格布局及指导

    黄金消息面与技术面解析 消息面 周二 11月2日 国际金价持稳 在通胀压力不断增加以及对经济增长放缓的担忧之际 市场参与者等待美联储本周政策会议结果 美国物价和薪资涨幅正处于数十年来的高位 本周可能让美联储官员面临挑战 分析师预计 在央行收
  • STM32串口烧写程序

    STM32烧写注意 1 必须使用串口1烧写 2 烧写 BOOT0置1 BOOT1置0 运行 BOOT0置0 BOOT1置任意 3 使用FLYMCU烧写软件 4 NRST引脚电路设计成悬空 按键按下 拉低 步骤 1 买一根 TTL串口线分别把
  • 全国各省、市、区(sql语句)

    文章目录 一 省份 数据表 二 市 数据表 注意 因为到县sql语句太多文章限字数上传不全 所以一半放到了另外的一篇文章上 三 上部分区 县 数据表 四 中部分区 县 数据表 五 下部分区 县 数据表 六 在在下部分区 县 数据表 返回项目
  • 股票分析,利用线性回归实时预测股价,只需要提供股票代码即可爬取相应股票数据并建模

    这里参考了别人的代码 并引用了tushare模块中定义的接口自动获取了依据 股票代码来获取数据 此篇文章提供了 1 一个简单通过接口爬取csv数据的方法 2 一个处理csv数据的简单方法 3 依据数据进行特征提取建立简单的股价预测模型 如下
  • 关于Pygame运行无响应问题的办法(已解决)

    目录 pygame程序运行时需要初始化 在关闭运行页面的时候无响应 pygame程序运行时需要初始化 如下代码运行后无反应 import sys import pygame size width height 600 400 screen
  • 华为机试2016

    编程题 最高分是多少 老师想知道从某某同学当中 分数最高的是多少 现在请你编程模拟老师的询问 当然 老师有时候需要更新某位同学的成绩 输入描述 输入包括多组测试数据 每组输入第一行是两个正整数N和M 0 lt N lt 30000 0 lt
  • 1.5.1 AlexNet

    目录 五 AlexNet 5 1 ReLU 激活函数 5 2 局部响应正则化 5 3 数据增强 5 4 Dropout 5 5 网络整体架构 5 6 小结 五 AlexNet AlexNet 是 2012 年第 3届 ILSVRC Imag