卷积神经网络之 - Alexnet
论文地址:https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf
2012 年, AlexNet 横空出世。这个模型的名字来源于论⽂第一作者的姓名 Alex Krizhevsky。AlexNet 使⽤了 8 层卷积神经⽹络,并以很⼤的优势赢得了 ImageNet 2012 图像识别挑战赛冠军。
- top1: 37.5%
- top5: 17.0%
- 6 千万参数 650000 个神经元
细化的结构图,来自互联网,侵删
与 LeNet 相比较
第⼀,与相对较小的 LeNet 相⽐, AlexNet 包含 8 层变换,其中有 5 层卷积和 2 层全连接隐藏层,以及 1 个全连接输出层。AlexNet 第⼀层中的卷积窗⼝形状是 11×11。因为 ImageNet 中绝⼤多数图像的⾼和宽均⽐ MNIST 图像 的⾼和宽⼤ 10 倍以上, ImageNet 图像的物体占⽤更多的像素,所以需要更⼤的卷积窗⼝来捕获物体。第⼆层中的卷积窗⼝形状减⼩到 5×5 ,之后全采⽤ 3×3。此外,第⼀、第⼆和第五个卷积层之后都使用了窗⼝形状为 3×3 、步幅为 2 的最⼤池化层。⽽且, AlexNet 使用的卷积通道数也⼤于 LeNet 中的卷积通道数数⼗倍。
第⼆,AlexNet 将 sigmoid 激活函数改成了更加简单的 ReLU 激活函数。⼀⽅⾯, ReLU 激活函数的计算更简单,例如它并没有 sigmoid 激活函数中的求幂运算。另⼀⽅⾯,ReLU 激活函数在不同的参数初始化⽅法下使模型更容易训练。这是由于当 sigmoid 激活函数输出极接近 0 或 1 时,这些区域的梯度几乎为 0,从⽽造成反向传播⽆法继续更新部分模型参数;⽽ ReLU 激活函数在正区间的梯度恒为 1。因此,若模型参数初始化不当, sigmoid 函数可能在正区间得到几乎为 0 的梯度,从⽽令模型⽆法得到有效训练。
Relu 比 Sigmoid 的效果好在哪里? Sigmoid 的导数只有在 0 的附近时有较好的激活性,而在正负饱和区域的梯度趋向于 0, 从而产生梯度弥散的现象,而 relu 在大于 0 的部分梯度为常数,所以不会有梯度弥散现象。Relu 的导数计算的更快。Relu 在负半区的导数为 0, 所以神经元激活值为负时,梯度为 0, 此神经元不参与训练,具有稀疏性。
第三, AlexNet 通过丢弃法(dropout)来控制全连接层的模型复杂度。⽽ LeNet 并没有使用丢弃法。
第四,AlexNet 引⼊了⼤量的图像增⼴,如翻转、裁剪和颜⾊变化,从⽽进⼀步扩⼤数据集来缓解过拟合。
代码实现
import time
import torch
from torch import nn, optim
import torchvision
class AlexNet(nn.Module):
def __init__(self):
super(AlexNet, self).__init__()
self.conv = nn.Sequential(
nn.Conv2d(1, 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),
# 连续3个卷积层,且使用更小的卷积窗口。除了最后的卷积层外,进一步增大了输出通道数。
# 前两个卷积层后不使用池化层来减小输入的高和宽
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)
)
# 这里全连接层的输出个数比LeNet中的大数倍。使用丢弃层来缓解过拟合
self.fc = nn.Sequential(
nn.Linear(256*5*5, 4096),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(4096, 4096),
nn.ReLU(),
nn.Dropout(0.5),
# 输出层。由于这里使用Fashion-MNIST,所以用类别数为10,而非论文中的1000
nn.Linear(4096, 10),
)
def forward(self, img):
feature = self.conv(img)
output = self.fc(feature.view(img.shape[0], -1))
return output
模型特性
- SGD, 128 batch-size, momentum=0.9, weight decay=0.0005, 学习率 = 0.01
- 所有卷积层都使用 ReLU 作为非线性映射函数,使模型收敛速度更快
- 在多个 GPU 上进行模型的训练,不但可以提高模型的训练速度,还能提升数据的使用规模
- 使用 LRN 对局部的特征进行归一化,结果作为 ReLU 激活函数的输入能有效降低错误率
- 重叠最大池化(overlapping max pooling),即池化范围 z 与步长 s 存在关系 z>s 避免平均池化(average pooling)的平均效应
- 使用随机丢弃技术(dropout)选择性地忽略训练中的单个神经元,避免模型的过拟合(也使用数据增强防止过拟合)
贡献 / 意义
- AlexNet 跟 LeNet 结构类似,但使⽤了更多的卷积层和更⼤的参数空间来拟合⼤规模数据集 ImageNet。它是浅层神经⽹络和深度神经⽹络的分界线。
- 虽然看上去 AlexNet 的实现⽐ LeNet 的实现也就多了⼏⾏代码而已,但这个观念上的转变和真正优秀实验结果的产⽣令学术界付出了很多年。
- Hibernate--Criteria Query and DetachedCriteria
- Python3 大作战之 encode 与 decode 讲解
- SpringMVC 文件下载时 浏览器不能正确显示另存的文件名
- 手把手教你用python抢火车票
- SpringMVC 实现多文件上传的两种方式及其效率比较
- Spring 之加载配置属性文件和注解属性绑定
- SpringMVC 提交表单400 Bad Request
- 如何在三年内快速成长为一名技术专家
- 【微信开发】getAccessToken 和 getJsapi_ticket缓存支持
- 微信JS-SDK 注入权限验证配置
- Maven 项目下slf4j 包冲突问题
- 谷歌教你学 AI-第三讲简单易懂的估算器
- 黑产是如何强刷用户银行卡8.1万元的?
- Spring 必知概念(二)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何在JSP里使用Java bean
- 获取指定时间内指定星期几的所有日期
- 使用JSP的标准标签库JSTL处理XML格式的数据
- (一)初识Mybatis-Plus
- org.apache.tomcat.util.scan.StandardJarScanner找不到serializer.jar的问题
- JAVA中获取当前系统时间
- 使用Supervisor管理进程
- vue 中使用threejs
- 数据库COUNT(*)、COUNT(字段)和COUNT(1)的异同
- 生成项目目录树
- 几行代码搞定智能插座控制丨云开发 × 涂鸦
- Elasticsearch Mapping是啥?
- 求水仙花数面试题 撸它
- 字典序???你是啥
- 【特征工程】时序特征挖掘的奇技淫巧