Pytorch:卷积神经网络-AlexNet

本文详细介绍了AlexNet深度卷积神经网络的结构与原理,包括其在ImageNet挑战中的突破,以及如何使用PyTorch实现。AlexNet通过8层网络结构,ReLU激活函数和数据增强等技术,展示了学习特征表示的优势,开启了深度学习在计算机视觉领域的广泛应用。
摘要由CSDN通过智能技术生成

Pytorch: 深度卷积神经网络-AlexNet

Copyright: Jingmin Wei, Pattern Recognition and Intelligent System, School of Artificial and Intelligence, Huazhong University of Science and Technology

Pytorch教程专栏链接


本教程不商用,仅供学习和参考交流使用,如需转载,请联系本人。

Reference

AlexNet 论文参考链接

前言

在 LeNet 提出后的将近 20 20 20 年里,神经网络一度被其他机器学习方法超越,如支持向量机。虽然 LeNet 可以在早期的小数据集上取得好的成绩,但是在更大的真实数据集上的表现并不尽如人意。一方面,神经网络计算复杂。虽然 20 20 20 世纪 90 90 90 年代也有过一些针对神经网络的加速硬件,但并没有像之后 GPU 那样大量普及。因此,训练一个多通道、多层和有大量参数的卷积神经网络在当年很难完成。另一方面,当年研究者还没有大量深入研究参数初始化和非凸优化算法等诸多领域,导致复杂的神经网络的训练通常较困难。

我们在上一节看到,神经网络可以直接基于图像的原始像素进行分类。这种称为端到端(end-to-end)的方法节省了很多中间步骤。然而,在很长一段时间里更流行的是研究者通过勤劳与智慧所设计并生成的手工特征。这类图像分类研究的主要流程是:

  • 获取图像数据集;

  • 使用已有的特征提取函数生成图像的特征;

  • 使用机器学习模型对图像的特征分类。

当时认为的机器学习部分仅限最后这一步。如果那时候跟机器学习研究者交谈,他们会认为机器学习既重要又优美。优雅的定理证明了许多分类器的性质。机器学习领域生机勃勃、严谨而且极其有用。然而,如果跟计算机视觉研究者交谈,则是另外一幅景象。他们会告诉你图像识别里“不可告人”的现实是:计算机视觉流程中真正重要的是数据和特征。也就是说,使用较干净的数据集和较有效的特征甚至比机器学习模型的选择对图像分类结果的影响更大。

学习特征表示

既然特征如此重要,它该如何表示呢?

我们已经提到,在相当长的时间里,特征都是基于各式各样手工设计的函数从数据中提取的。事实上,不少研究者通过提出新的特征提取函数不断改进图像分类结果。这一度为计算机视觉的发展做出了重要贡献。

然而,另一些研究者则持异议。他们认为特征本身也应该由学习得来。他们还相信,为了表征足够复杂的输入,特征本身应该分级表示。持这一想法的研究者相信,多层神经网络可能可以学得数据的多级表征,并逐级表示越来越抽象的概念或模式。以图像分类为例,并回忆二维卷积层中物体边缘检测的例子。在多层神经网络中,图像的第一级的表示可以是在特定的位置和⻆度是否出现边缘;而第二级的表示说不定能够将这些边缘组合出有趣的模式,如花纹;在第三级的表示中,也许上一级的花纹能进一步汇合成对应物体特定部位的模式。这样逐级表示下去,最终,模型能够较容易根据最后一级的表示完成分类任务。需要强调的是,输入的逐级表示由多层模型中的参数决定,而这些参数都是学出来的。

尽管一直有一群执着的研究者不断钻研,试图学习视觉数据的逐级表征,然而很长一段时间里这些野心都未能实现。这其中有诸多因素值得我们一一分析。

缺失要素一:数据

包含许多特征的深度模型需要大量的有标签的数据才能表现得比其他经典方法更好。限于早期计算机有限的存储和90年代有限的研究预算,大部分研究只基于小的公开数据集。例如,不少研究论文基于加州大学欧文分校(UCI)提供的若干个公开数据集,其中许多数据集只有几百至几千张图像。这一状况在 2010 2010 2010 年前后兴起的大数据浪潮中得到改善。特别是, 2009 2009 2009 年诞生的ImageNet数据集包含了 1000 1000 1000 大类物体,每类有多达数千张不同的图像。这一规模是当时其他公开数据集无法与之相提并论的。ImageNet数据集同时推动计算机视觉和机器学习研究进入新的阶段,使此前的传统方法不再有优势。

缺失要素二:硬件

深度学习对计算资源要求很高。早期的硬件计算能力有限,这使训练较复杂的神经网络变得很困难。然而,通用 GPU 的到来改变了这一格局。很久以来,GPU 都是为图像处理和计算机游戏设计的,尤其是针对大吞吐量的矩阵和向量乘法从而服务于基本的图形变换。值得庆幸的是,这其中的数学表达与深度网络中的卷积层的表达类似。通用 GPU 这个概念在 2001 2001 2001 年开始兴起,涌现出诸如 OpenCL 和 CUDA 之类的编程框架。这使得 GPU 也在 2010 2010 2010 年前后开始被机器学习社区使用。

AlexNet

2012 2012 2012 年,AlexNet 横空出世。这个模型的名字来源于论文第一作者的姓名Alex Krizhevsky。AlexNet 使用了 8 8 8 层卷积神经网络,并以很大的优势赢得了ImageNet 2012 2012 2012 图像识别挑战赛。它首次证明了学习到的特征可以超越手工设计的特征,从而一举打破计算机视觉研究的前状。

AlexNet 网络结构

AlexNet 与 LeNet 的设计理念非常相似,但也有显著的区别。

第一,与相对较小的 LeNet 相比,AlexNet 包含 8 8 8 层变换,其中有 5 5 5 层卷积和 2 2 2 层全连接隐藏层,以及 1 1 1 个全连接输出层。下面我们来详细描述这些层的设计。

AlexNet 第一层中的卷积窗口形状是 11 × 1111 × 11 11×1111×11 11×1111×11 。因为 ImageNet 中绝大多数图像的高和宽均比 MNIST 图像的高和宽大 10 10 10 倍以上,ImageNet 图像的物体占用更多的像素,所以需要更大的卷积窗口来捕获物体。第二层中的卷积窗口形状减小到 5 × 5 5×5 5×5 ,之后全采用 3 × 3 3×3 3×3 。此外,第一、第二和第五个卷积层之后都使用了窗口形状为 3 × 3 3×3 3×3 、步幅为 2 2 2 的最大池化层。而且,AlexNet 使用的卷积通道数也大于 LeNet 中的卷积通道数数十倍。

紧接着最后一个卷积层的是两个输出个数为 4096 4096 4096 的全连接层。这两个巨大的全连接层带来将近 1 1 1 GB 的模型参数。由于早期显存的限制,最早的AlexNet使用双数据流的设计使一个 GPU 只需要处理一半模型。幸运的是,显存在过去几年得到了长足的发展,因此通常我们不再需要这样的特别设计了。

第二,AlexNet 将 sigmoid 激活函数改成了更加简单的 ReLU 激活函数。一方面,ReLU 激活函数的计算更简单,例如它并没有 sigmoid 激活函数中的求幂运算。另一方面,ReLU激活函数在不同的参数初始化方法下使模型更容易训练。这是由于当 sigmoid 激活函数输出极接近 0 0 0 1 1 1 时,这些区域的梯度几乎为 0 0 0 ,从而造成反向传播无法继续更新部分模型参数;而ReLU激活函数在正区间的梯度恒为 1 1 1 。因此,若模型参数初始化不当,sigmoid 函数可能在正区间得到几乎为 0 0 0 的梯度,从而令模型无法得到有效训练。

第三,AlexNet 通过 Dropout 层来控制全连接层的模型复杂度。而 LeNet 并没有使用。

第四,AlexNet 引入了大量的图像增广,如翻转、裁剪和颜色变化,从而进一步扩大数据集来缓解过拟合。

在这里插入图片描述

import numpy as np
import pandas as pd
from sklearn.metrics import 
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值