经典神经网络(2)AlexNet及其在Fashion-MNIST数据集上的应用

news2024/11/24 20:11:16

2、深度卷积神经网络AlexNet

  1. ImageNet 数据集:一个开源的图片数据集,包含超过 1400万张图片和图片对应的标签,包含2万多个类别。

    自从2010 年以来,ImageNet 每年举办一次比赛,即:ImageNet 大规模视觉识别挑战赛ILSVRC ,比赛使用 1000 个类别图片。

    2017年7月,ImageNet 宣布ILSVRC2017 年正式结束,因为图像分类、物体检测、物体识别任务中计算机的正确率都远超人类,计算机视觉在感知方面的问题基本得到解决,后续将专注于目前尚未解决的问题。

  2. ImageNet 中使用两种错误率作为评估指标:

    • top-5 错误率:对一个图片,如果正确标记在模型输出的前 5 个最佳预测(即:概率最高的前5个)中,则认为是正确的,否则认为是错误的。

      最终错误预测的样本数占总样本数的比例就是 top-5 错误率。

    • top-1 错误率:对一个图片,如果正确标记等于模型输出的最佳预测(即:概率最高的那个),则认为是正确的,否则认为是错误的。

      最终错误预测的样本数占总样本数的比例就是 top-1 错误率。

2.1 AlexNet简述

2.1.1 AlexNet概述

在LeNet提出后,卷积神经⽹络在计算机视觉和机器学习领域中很有名⽓。但卷积神经⽹络并没有主导这些领域。这是因为虽然LeNet在⼩数据集上取得了很好的效果,但是在更⼤、更真实的数据集上训练卷积神经⽹络的性能和可⾏性还有待研究。事实上,在上世纪90年代初到2012年之间的⼤部分时间⾥,神经⽹络往往被其他机器学习⽅法超越,如⽀持向量机(support vector machines)。

Alex Krizhevsky【Hinton的博士,AlexNet一作】、Ilya Sutskever【OpenAI联合创始人和首席科学家】和Geoff Hinton【2018 年,与 Yoshua Bengio、Yann LeCun 共同获得了图灵奖】提出了⼀种新的卷积神经⽹络变体AlexNet,在2012年ImageNet挑战赛中,AlexeNet 以远超第二名的成绩夺冠,使得深度学习重回历史舞台,具有重大历史意义。

AlexNet论文下载地址:https://proceedings.neurips.cc/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf

【论文摘要翻译如下】

"""
我们训练了一个大型的深度卷积神经网络,将ImageNet LSVRC-2010竞赛中的120万张高分辨率图像分类成
1000种不同的类别。在测试数据上,我们取得了Top1 37.5%和Top-5 17.0%的错误率,这个结果已经远超
以前的最高水平。该神经网络具有6千万个参数和650,000个神经元,它由5个卷积层和3个全连接层构成,其
中部分卷积层后边跟有最大池化层,全连接层后边则是一个1000路的softmax分类器。为了使训练速度更
快,我们使用了非饱和神经元和一种卷积操作的非常高效的GPU实现。为了减少全连接层中的过拟合,我们使
用了一个最近开发的被称作“暂退法”的正则化方法,该方法已被证明十分有效。在IOLSVRC-2012竞赛中,我
们正式提出这个模型的一种变体,并以15.3%的top-5测试误差率赢得榜首,相比而言,第二好的参赛队伍则
只取得26.2%的成绩。
"""

2.1.2 LeNet和AlexNet的对比

AlexNet和LeNet的架构⾮常相似,这⾥我们提供了⼀个稍微精简版本的AlexNet,去除了当年需要两个⼩型GPU同时运算的设计特点。

左边为LeNet,右边为AlexNet

在这里插入图片描述

AlexNet和LeNet的设计理念⾮常相似,但也存在显著差异。

⾸先,AlexNet⽐相对较小的LeNet5要深得多。

AlexNet由⼋层组成:五个卷积层、两个全连接隐藏层和⼀个全连接输出层。

其次,AlexNet使⽤ReLU⽽不是sigmoid作为其激活函数。

2.1.3 AlexNet的网络结构

在这里插入图片描述

可以看到,由于早期GPU显存有限,原版的AlexNet采⽤了双数据流设计,使得每个GPU只负责存储和计算模型的⼀半参数。幸运的是,现在GPU显存相对充裕,所以我们现在很少需要跨GPU分解模型

AlexNet 有5个广义卷积层和3个广义全连接层。

  • 广义的卷积层:包含了卷积层、池化层、ReLULRN 层等。
  • 广义全连接层:包含了全连接层、ReLUDropout 层等。

网络结构如下表所示:

  • 输入层会将3@224x224 的三维图片预处理变成3@227x227 的三维图片。

  • 第二层广义卷积层、第四层广义卷积层、第五层广义卷积层都是分组卷积,仅采用本GPU 内的通道数据进行计算。

    第一层广义卷积层、第三层广义卷积层、第六层连接层、第七层连接层、第八层连接层执行的是全部通道数据的计算。

  • 第二层广义卷积层的卷积、第三层广义卷积层的卷积、第四层广义卷积层的卷积、第五层广义卷积层的卷积均采用same 填充。

    当卷积的步长为1,核大小为3x3 时,如果不填充0,则feature map 的宽/高都会缩减 2 。因此这里填充0,使得输出feature map 的宽/高保持不变。

    其它层的卷积,以及所有的池化都是valid 填充(即:不填充 0 )。

  • 第六层广义连接层的卷积之后,会将feature map 展平为长度为 4096 的一维向量。

编号网络层子层核/池大小核数量步长填充激活函数输入尺寸输出尺寸
第0层输入层-------3@224x224
第1层广义卷积层卷积11x11964-ReLU3@227x22796@55x55
第1层广义卷积层池化3x3-2--96@55x5596@27x27
第1层广义卷积层LRN-----96@27x2796@27x27
第2层广义卷积层卷积5x525612ReLU96@27x27256@27x27
第2层广义卷积层池化3x3-2--256@27x27256@13x13
第2层广义卷积层LRN-----256@13x13256@13x13
第3层广义卷积层卷积3x338411ReLU256@13x13384@13x13
第4层广义卷积层卷积3x338411ReLU384@13x13384@13x13
第5层广义卷积层卷积3x325611ReLU384@13x13256@13x13
第5层广义卷积层池化3x3-2--256@13x13256@6x6
第6层广义连接层卷积6x640961-ReLU256@6x64096@1x1
第6层广义连接层dropout-----4096@1x14096@1x1
第7层广义连接层全连接----ReLU40964096
第7层广义连接层dropout-----40964096
第8层广义连接层全连接-----40961000

我们用pytorch进行实现

import torch.nn as nn
import torch

class AlexNet(nn.Module):

    def __init__(self):
        super().__init__()
        self.model = nn.Sequential(
                # 使⽤⼀个11*11的更⼤窗⼝来捕捉对象。
                # 同时,步幅为4,以减少输出的⾼度和宽度。
                # 另外,输出通道的数⽬远⼤于LeNet
                nn.Conv2d(1, 96, kernel_size=11, stride=4),
                nn.ReLU(),
                nn.MaxPool2d(kernel_size=3, stride=2),

                # 减⼩卷积窗⼝,使⽤填充为2来使得输⼊与输出的⾼和宽⼀致,且增⼤输出通道数
                nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(),
                nn.MaxPool2d(kernel_size=3, stride=2),

                # 使⽤三个连续的卷积层和较⼩的卷积窗⼝。
                # 除了最后的卷积层,输出通道的数量进⼀步增加。
                # 在前两个卷积层之后,汇聚层不⽤于减少输⼊的⾼度和宽度
                nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(),
                nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),
                nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(),
                nn.MaxPool2d(kernel_size=3, stride=2),
                nn.Flatten(),

                # 这⾥,全连接层的输出数量是LeNet中的好⼏倍。使⽤dropout层来减轻过拟合
                nn.Linear(9216, 4096), nn.ReLU(),
                nn.Dropout(p=0.5),
                nn.Linear(4096, 4096), nn.ReLU(),
                nn.Dropout(p=0.5),
                # 最后是输出层。由于这⾥使⽤Fashion-MNIST,所以⽤类别数为10,⽽⾮论⽂中的1000
                nn.Linear(4096, 10)
        )

    def forward(self, X):
        X = self.model(X)
        return X

if __name__ == '__main__':
    net = AlexNet()
    # 测试神经网络是否可运行
    # inputs = torch.rand(size=(1, 1, 227, 227), dtype=torch.float32)
    # outputs = net(inputs)
    # print(outputs.shape)
    X = torch.rand(size=(1, 1, 227, 227), dtype=torch.float32)
    for layer in net.model:
        X = layer(X)
        print(layer.__class__.__name__, 'output shape:', X.shape)
"""
第1层:广义卷积层
Conv2d output shape: torch.Size([1, 96, 55, 55])
ReLU output shape: torch.Size([1, 96, 55, 55])
MaxPool2d output shape: torch.Size([1, 96, 27, 27])

第2层:广义卷积层
Conv2d output shape: torch.Size([1, 256, 27, 27])
ReLU output shape: torch.Size([1, 256, 27, 27])
MaxPool2d output shape: torch.Size([1, 256, 13, 13])

第3层:广义卷积层
Conv2d output shape: torch.Size([1, 384, 13, 13])
ReLU output shape: torch.Size([1, 384, 13, 13])

第4层:广义卷积层
Conv2d output shape: torch.Size([1, 384, 13, 13])
ReLU output shape: torch.Size([1, 384, 13, 13])

第5层:广义卷积层
Conv2d output shape: torch.Size([1, 256, 13, 13])
ReLU output shape: torch.Size([1, 256, 13, 13])
MaxPool2d output shape: torch.Size([1, 256, 6, 6])

第6层:广义连接层
Flatten output shape: torch.Size([1, 9216])
Linear output shape: torch.Size([1, 4096])
ReLU output shape: torch.Size([1, 4096])
Dropout output shape: torch.Size([1, 4096])

第7层:广义连接层
Linear output shape: torch.Size([1, 4096])
ReLU output shape: torch.Size([1, 4096])
Dropout output shape: torch.Size([1, 4096])

第8层:广义连接层
Linear output shape: torch.Size([1, 10])
"""

2.2 AlexNet的创新点

AlexNet 成功的主要原因在于:

  • 使用ReLU 激活函数。
  • 使用dropout、数据集增强 、重叠池化等防止过拟合的方法。
  • 使用百万级的大数据集来训练。
  • 使用GPU训练,以及的LRN 使用。
  • 使用带动量的 mini batch 随机梯度下降来训练。

2.2.1 局部响应规范化

局部响应规范层LRN:目地是为了进行一个横向抑制,使得不同的卷积核所获得的响应产生竞争。

  • LRN 层现在很少使用,因为效果不是很明显,而且增加了内存消耗和计算时间。

2.2.2 数据集增强

  1. AlexNet 中使用的数据集增强手段:

    • 随机裁剪、随机水平翻转:原始图片的尺寸为256xx256,裁剪大小为224x224

      • 每一个epoch 中,对同一张图片进行随机性的裁剪,然后随机性的水平翻转。理论上相当于扩充了数据集 倍。

      • 在预测阶段不是随机裁剪,而是固定裁剪图片四个角、一个中心位置,再加上水平翻转,一共获得 10 张图片。

        用这10张图片的预测结果的均值作为原始图片的预测结果。

    • PCA 降噪:对RGB空间做PCA 变换来完成去噪功能。同时在特征值上放大一个随机性的因子倍数(单位1 加上一个 的高斯绕动),从而保证图像的多样性。

      • 每一个epoch 重新生成一个随机因子。
      • 该操作使得错误率下降1%
  2. AlexNet 的预测方法存在两个问题:

    • 这种固定裁剪四个角、一个中心的方式,把图片的很多区域都给忽略掉了。很有可能一些重要的信息就被裁剪掉。
    • 裁剪窗口重叠,这会引起很多冗余的计算。

    改进的思路是:

    • 执行所有可能的裁剪方式,对所有裁剪后的图片进行预测。将所有预测结果取平均,即可得到原始测试图片的预测结果。
    • 减少裁剪窗口重叠部分的冗余计算。

具体做法为:将全连接层用等效的卷积层替代,然后直接使用原始大小的测试图片进行预测。将输出的各位置处的概率值按每一类取平均(或者取最大),则得到原始测试图像的输出类别概率。

2.2.3 重叠池化

  1. 一般的池化是不重叠的,池化区域的大小与步长相同。Alexnet 中,池化是可重叠的,即:步长小于池化区域的大小。

    重叠池化可以缓解过拟合,该策略贡献了0.4% 的错误率。

  2. 为什么重叠池化会减少过拟合,很难用数学甚至直观上的观点来解答。一个稍微合理的解释是:重叠池化会带来更多的特征,这些特征很可能会有利于提高模型的泛化能力。

2.2.4 优化算法

在这里插入图片描述

2.3 AlexNet在Fashion-MNIST数据集上的应用代码

2.3.1 创建AlexNet网络模型

import torch.nn as nn
import torch

class AlexNet(nn.Module):

    def __init__(self):
        super().__init__()
        self.model = nn.Sequential(
                # 这⾥,我们使⽤⼀个11*11的更⼤窗⼝来捕捉对象。
                # 同时,步幅为4,以减少输出的⾼度和宽度。
                # 另外,输出通道的数⽬远⼤于LeNet
                nn.Conv2d(1, 96, kernel_size=11, stride=4,padding=1), # 1、填充设置为1
                nn.ReLU(),
                nn.MaxPool2d(kernel_size=3, stride=2),

                # 减⼩卷积窗⼝,使⽤填充为2来使得输⼊与输出的⾼和宽⼀致,且增⼤输出通道数
                nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(),
                nn.MaxPool2d(kernel_size=3, stride=2),

                # 使⽤三个连续的卷积层和较⼩的卷积窗⼝。
                # 除了最后的卷积层,输出通道的数量进⼀步增加。
                # 在前两个卷积层之后,汇聚层不⽤于减少输⼊的⾼度和宽度
                nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(),
                nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),
                nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(),
                nn.MaxPool2d(kernel_size=3, stride=2),
                nn.Flatten(),

                # 这⾥,全连接层的输出数量是LeNet中的好⼏倍。使⽤dropout层来减轻过拟合
                nn.Linear(6400, 4096), nn.ReLU(), # 2、输出相对2.1.3降为6400
                nn.Dropout(p=0.5),
                nn.Linear(4096, 4096), nn.ReLU(),
                nn.Dropout(p=0.5),
                # 最后是输出层。由于这⾥使⽤Fashion-MNIST,所以⽤类别数为10,⽽⾮论⽂中的1000
                nn.Linear(4096, 10)
        )

    def forward(self, X):
        X = self.model(X)
        return X

if __name__ == '__main__':
    net = AlexNet()
    # 测试神经网络是否可运行
    inputs = torch.rand(size=(1, 1, 224, 224), dtype=torch.float32)
    outputs = net(inputs)
    print(outputs.shape)
    # X = torch.rand(size=(1, 1, 224, 224), dtype=torch.float32)
    # for layer in net.model:
    #     X = layer(X)
    #     print(layer.__class__.__name__, 'output shape:', X.shape)

2.3.2 读取Fashion-MNIST数据集

其他所有的函数,与经典神经网络(1)LeNet及其在Fashion-MNIST数据集上的应用完全一致。

'''
Fashion-MNIST图像的分辨率(28×28像素)低于ImageNet图像。为了解决这个问题,增加到224×224
'''
batch_size = 128
train_iter, test_iter = load_data_fashion_mnist(batch_size, resize=224)

2.3.2 模型训练

from _02_AlexNet import AlexNet

# 初始化模型
net = AlexNet()


# 与LeNet相比,使⽤更⼩的学习速率训练,这是因为⽹络更深更⼴、图像分辨率更⾼,训练卷积神经⽹络就更昂贵
# 注意需要用GPU进行训练

lr, num_epochs = 0.01, 10
train_ch(net, train_iter, test_iter, num_epochs, lr, try_gpu())
loss 0.327, train acc 0.881, test acc 0.885
4149.6 examples/sec on cuda:0

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/518663.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数组排序算法

数组排序算法 一、冒泡排序算法二、直接选择排序三、插入排序四、反转排序 一、冒泡排序算法 冒泡排序算法: 类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断向前移动。 基本思想: 冒泡排序的基本思想是对比相邻的两个元素值&…

并发编程(二) — 内存可见性问题

目录 前言 内存可见性问题 synchronized volatile CAS算法 CAS算法原理 CAS算法应用场景 CAS算法代码实现 参考目录 前言 在谈共享变量的内存可见性问题之前,先谈谈线程安全问题 ,线程安全问题是指当多个线程同时读写一个共享资源并且没有任何同…

c高级day4作业

有m1.txt m2.txt m3.txt m4.txt,分别创建出对应的目录,m1 m2 m3 m4 并把文件移动到对应的目录下使用break关键字打印九九乘法表,提示:printf "%d * %d %d" $i $j $((i*j)) #!/bin/bash for i in m1 m2 m3 m4 do#文件夹…

只限今日免费,Midjourney 5.1震撼更新!逼真到给跪,中国情侣细节惊艳,3D视频大片马上来

来源 | 新智元 微信号:AI-era 【导读】全新升级的Midjourney让全网又疯狂了,创造力解禁,出图更逼真。重要的是,限时免费到今天,要玩的抓紧了。 一个月前,Midjourney V5画的一对中国完美情侣在网上爆火&am…

涅槃重生,BitKeep如何闯出千万用户新起点

在全球,BitKeep钱包现在已经有超过千万用户在使用。 当我得知这个数据的时候,有些惊讶,也有点意料之中。关注BitKeep这几年,真心看得出这家公司的发展之迅速。还记得2018年他们推出第一个版本时,小而美,简洁…

python和pycharm的安装(安装包免费下载共享)

说明: 本文内容包括Python和Pycharm安装。 一、python安装: python是一门编程语言,安装python是为了能在电脑上使用这门语言。 1、python下载 下载链接:https://pan.baidu.com/s/1mWsJjO8HngNQtINCzu0bBA 提取码:9…

又又又发现了一个 AI 插件神器 TeamSmart

简介 TeamSmart AI 是最近比较火的 Chrome 插件,它是基于 ChatGPT 集成的 AI 助手团队工具 对,没错,是一个团队。这个团队里面有许多不同角色的成员,每隔成员都有自己的专业领域,比如商业、市场营销、灵魂写手、程序…

批量查看域名历史软件-网站老域名批量查询注册

未注册备案域名批量扫描软件 未注册备案域名批量扫描软件是专门用于批量扫描未备案的域名的一种工具。它可以快速识别未备案的域名,并帮助用户抓住还未被注册的值得备案的域名,以便用户及时注册备案并使用。 该软件主要具有以下几个优点: 高…

【小程序】输入框检验姓名、身份证(正则表达式)并提交

目标 输入绑定姓名、身份证号并进行校验若未填或校验不通过则显示绑定失败的轻提示若通过校验并提交则显示绑定成功 使用Vant Weapp (gitee.io)库。 思路与代码 html: wx:model绑定输入框输入的值data-key是一个属性,在js中的e.currentTarget.datase…

【新星计划-2023】ARP“攻击”与“欺骗”的原理讲解

网络管理员在网络维护阶段需要处理各种各样的故障,出现最多的就是网络通信问题。除物理原因外,这种现象一般是ARP攻击或ARP欺骗导致的。无论是ARP攻击还是ARP欺骗,它们都是通过伪造ARP应答来实现的。 一、ARP攻击原理 一般情况下&#xff0…

TypeScript语言编译命令

1. 安装 npm install -g typescript2. 编译 tsc工具是TypeScript编译器的控制台接口,它可以将TypeScript文件编译成JavaScript文件; 编译文件: tsc [options] [file ...]查看编译命令的帮助信息: tsc --help或者 tsc -h或者 tsc…

微服架构基础设施环境平台搭建 -(一)基础环境准备

微服架构基础设施环境平台搭建 -(一)基础环境准备 通过采用微服相关架构构建一套以KubernetesDocker为自动化运维基础平台,以微服务为服务中心,在此基础之上构建业务中台,并通过Jekins自动构建、编译、测试、发布的自动…

【Java AWT 图形界面编程】IntelliJ IDEA 乱码问题最佳配置方案 ( 配置文件编码 | 配置编译器编码参数 | 配置运行时编码参数 )

文章目录 一、IntelliJ IDEA 乱码问题二、IntelliJ IDEA 乱码问题最佳配置方案1、文件编码设置成 UTF-82、编译器编码参数设置成 UTF-83、 配置运行时编码参数为 GBK 一、IntelliJ IDEA 乱码问题 在 IntelliJ IDEA 中开发 AWT / Swing 图形界面程序 , 经常遇到乱码问题 ; 文件…

博文的跑路笔记

HTML CSS Flex布局 使用flex布局 容器 .box {display: flex; }行内元素 .box {display: inline-flex; }flex布局后,float、vertical-align、clear失效。 容器属性 flex-direction:主轴方向 属性值 row:子元素起点在左,左到右。…

初级面试问到rabbitMQ,看这一篇文章就够了!

一、rabbitMQ的基础要点回顾 1.使用场景 1)解耦:使用消息队列避免模块间的直接调用。将所需共享的数据放在消息队列中,对于新增的业务模块,只要对该类消息感兴趣就可以订阅该消息,对原有系统无影响,降低了…

防范化解灾害风险,科技筑牢安全城墙

气象灾害:大气圈变异活动会对人类生命财产和国民经济及国防建设等造成的直接或间接损害。我国气象灾害种类繁多,不仅包括台风、暴雨、冰雹、大风、雷暴、暴风雪等天气灾害,还包括干旱、洪涝、持续高温、雪灾等气候灾害。此外,与气…

Docker中部署监控

Docker概念 一、部署Prometheus+grafana环境 1.1 、部署Prometheus+grafana环境 docker pull registry.cn-hangzhou.aliyuncs.com/lhrbest/lhrprometheus:1.0 docker tag registry.cn-hangzhou.aliyuncs.com/lhrbest/lhrprometheus:1.0 lhrbest/lhrprometheus:1.01.2 、创建镜…

【分布式事务】Seata 之 @GlobalTransactional 在TM侧的核心逻辑

文章目录 一、概述二、GlobalTransactional核心逻辑三、GlobalTransactional核心源码解读四、事务能力的启停运行期的开关变更 一、概述 Seata 依赖 Spring 的注解机制,实现声明式事务,即开发者给 Bean 使用GlobalTransactional注解 ,Seata …

深度学习03-卷积神经网络(CNN)

简介 CNN,即卷积神经网络(Convolutional Neural Network),是一种常用于图像和视频处理的深度学习模型。与传统神经网络相比,CNN 有着更好的处理图像和序列数据的能力,因为它能够自动学习图像中的特征&…

GIS 根据投影坐标点获取投影坐标所属的投影坐标系EPSG

什么是EPSG? EPSG(The European Petroleum Survey Group,官网 http://www.epsg.org/)维护着空间参照对象的数据集,OGC标准中空间参照系统的SRID(Spatial Reference System Identifier)与EPSG的空间参照系统ID相一致。…