深度学习——AlexNet

论文信息

论文名称:ImageNet Classification with Deep Convolutional Neural Networks
论文别名:AlexNet
发表期刊:NIPS
论文地址:
https://www.cin.ufpe.br/~rmd2/ImageNet%20classification%20wth%20deep%20convolutional%20neural%20networks.pdf

摘要

在这里插入图片描述

精简翻译和总结

作者训练了一个大的、深的卷积神经网络来对1200万张高分辨率图像进行分类,这些图片是2010年ILSVRC比赛的图片,总共分为1000个类别。在测试数据上,top-1和top-5错误率分别为37.5%和17%,比现有的SOTA(state-of-the-art)结果还有优越。神经网络总购有6000万参数以及65万个神经元,包含5个卷积层,其中一些卷积层后面跟着最大池化层,包含3个全连接层和一个1000维的softmax。为了使得训练更快,作者使用了非饱和的神经元(ReLU)和一个非常高效的GPU来实现卷积操作,为了减轻全连接层的过拟合,作者使用了一个最近才发布的正则化方法Dropout,并被证明是十分有效的。作者还在2012年的ILSVRC比赛中使用了一个该模型的变种,并且结果比第二名要好很多

批注

SOTA:( state-of-the-art )最佳结果
ILSVRC:the ImageNet Large-Scale Visual Recognition Challenge
ReLU:(Rectified Linear Unit) , 非饱和激活函数, f ( x ) = m a x ( 0 , x ) f(x)=max(0,x) f(x)=max(0,x)
top-1和top-5:top-1 就是使用预测结果和正确结果进行对比,如果相同则表示预测正确,top-5 就是使用预测结果的.top-5(分类结果标签的前五个)与正确结果进行对比,如果五个之中有一个正确那么就认为分类器预测结果正确。
ImageNet:华裔科学家李飞飞牵头构建的数据集

1.引言

1.1 指出问题和可改进方向

在这里插入图片描述

现有的目标识别方法大量采用了机器学习方法 ,为了提升他们的性能,可以考虑收集更大的数据集训练更强大的模型或者使用更好的技术来防止过拟合。迄今为止,数据集的规模仍然是非常小的。简单的分类任务如可以在小规模数据集上表现很好,但是物体在现实世界中存在相当大的可变性,所以想要识别他们必须采用更大的数据集来学习他们的共性的特征。

在这里插入图片描述
为了能够在1200万张图像中学得数千个类别,我们需要具有强大学习能力的模型。物体识别任务的复杂性意味着你不可能把每一个类别的数据集都构建得和ImageNet 一样大,因此模型需要获得先验知识来弥补这方面的不足。CNN的识别能力与他的深度和宽度有着很大的关系。与标准的前馈神经网络相比,CNNs的连接和参数量比较少,容易训练。
在这里插入图片描述
尽管它性能好,但是在2012年的时候训练这样一个网络是非常昂贵的,比较幸运的是当时的GPU已经可以进行2D的卷积运算,减轻了训练的难度,并且ImageNet数据集足够大不会发生严重的过拟合。

1.2本文贡献

在这里插入图片描述

① 使用了ImageNet的子集,训练了当时最大的网络之一,并运用在了2010年和2012年的比赛中,并获得了最好的结果。
② 实现了2D的GPU卷积运算,并运用在了网络的训练中,我们将它开源了。(从我的视角来看,这个相当牛逼
③网络使用到了许多新的不常规的特征来提升性能,减少训练时间
④ 重点研究过拟合问题,并使用了几个技术来解决过拟合
⑤最终网络包含5个卷积层,三个全连接层,并且作者认为深度是非常重要的,移除任何一个卷积层会降低性能。

1.3 批注

CNN:convolutional neural networks

2.数据集

在这里插入图片描述

使用ImageNet 的子集,包含1200万张训练图片,5万张验证图片和15万张测试图片(有个很奇怪的现象,在随后的七八年,构建了很多更大的数据集,但是只有训练集和测试集,验证集消失了,不知道是不是数据集足够大,测试集数据可以近似等价与现实中的数据分布,所以不很出现过拟合和泛化性能下降问题,所以不需要验证集了,当然这仅是我个人的猜测

ImageNet 包含不同分辨率的图片(其实也就是大小不同的意思),作者把图像的短边缩放到256,然后根据中心点进行裁剪,得到256x256的图片。此外没有对图像再做其他任何的预处理。

2.1 批注

ImageNet数据集的均值和方差为:mean=(0.485, 0.456, 0.406),std=(0.229, 0.224, 0.225),在之后出现的很多卷积神经网络的训练过程中很多都用到了这个值,当然它的结果并不一定会很好。

3.模型结构

作者根据相关部分的重要性进行先后的叙述。

3.1 ReLU

使用了新的非饱和激活函数ReLU,可以加速模型的收敛,减少模型的训练时间

3.2 多GPU分布式训练

随着GPU的发展,现在AlexNet不需要多GPU训练了,但是这个分布式训练的方法可以用在其他大型网络的训练中,比如GPT

3.3 Local Response Normalization(LRN 局部响应归一化)

在这里插入图片描述

a x , y i a_{x,y}^i ax,yi是第 i i i个卷积核在 ( x , y ) (x,y) (x,y)位置计算,并经过激活函数后得到的值, b x , y i b_{x,y}^i bx,yi通过那个复杂的公式得到,这个求和作用在 n n n个近邻核的相同空间位置上, N N N是这一层卷积核的数量,假设作用在AlexNet的第一层,那么卷积核的个数 N N N为96。其中 k = 2 , n = 5 , a = 1 0 − 4 , β = 0.75 k=2,n=5,a=10^{-4},\beta=0.75 k=2,n=5,a=104,β=0.75,把值带入公式后,你会发现公式变得简单了很多,变量只有 i , j i,j i,j,再结合下面这张图你就明白了
b x , y i = a x , y i / ( 2 + 1 0 − 4 ∑ j = m a x ( 0 , i − 5 / 2 ) m i n ( 95 , i + 5 / 2 ) ( a x , y j ) 2 ) 0.75 b_{x,y}^i =a_{x,y}^i /(2+10^{-4}\sum_{j=max(0,i-5/2)}^{min(95,i+5/2)} (a_{x,y}^j)^2)^{0.75 } bx,yi=ax,yi/(2+104j=max(0,i5/2)min(95,i+5/2)(ax,yj)2)0.75

在这里插入图片描述
n = 5 {n=5} n=5表示当我们在对一个元素进行归一化的时候,只考虑到沿channel维度上(也就是一维的情况),这个元素的前两个元素和后两个元素。这意味着,我们在计算{(i,x,y)}这个点归一化后的值时,只需要考虑 ( i − 2 , x , y ),( i − 1 , x , y ),( i , x , y ) , ( i + 1 , x , y ) , ( i + 2 , x , y ) {(i-2,x,y),(i-1,x,y),(i,x,y),(i+1,x,y),(i+2,x,y)} i2xy),(i1xy),(ixy,i+1xy,i+2xy的值即可,如果超过边界则默认为0。

3.4 重叠池化

一般情况下池化的步长stride和filter过滤器的大小是相等的,但在本文中,stride为2,filter过滤器的边长是3

3.5 模型总体结构

在这里插入图片描述

3.5.1 卷积层输出特征图的计算公式

O = I − K + 2 P S + 1 O=\frac{I-K+2P}{S}+1 O=SIK+2P+1

3.5.2 模型详解
layer namekernel sizekernel numstridepaddinginput sizeoutput sizeinformation
Conv111x11x348x( 2 G P U ) 2_{GPU}) 2GPU)=9642224x224x355x55x96后面先接ReLU 然后接LRN
Pool13x3/2/55x55x9627x27x96
Conv25x5x96128x( 2 G P U ) 2_{GPU}) 2GPU)=2561227x27x9627x27x256后面先接ReLU 然后接LRN
Pool23x3/2/27x27x25613x13x256
Conv33x3x256192x( 2 G P U ) 2_{GPU}) 2GPU)=3841213x13x25613x13x384后面接ReLU
Conv43x3x384192x( 2 G P U ) 2_{GPU}) 2GPU)=3841213x13x38413x13x384后面接ReLU
Conv53x3x384128x( 2 G P U ) 2_{GPU}) 2GPU)=2561213x13x38413x13x256后面接ReLU
Pool33x3/2/13x13x2566x6x256后面接Dropout
FC1////6x6x2564096后面先ReLU,再接Dropout
FC2////40964096后面接ReLU
FC3////40961000后面接Softmax,训练阶段Softmax是隐藏在损失函数里实现的

3.6 批注

这里需要注意的是归一化层是分别接在第一个和第二个卷积层之后的,最大池化层是接在第一个和第二个归一化层之后以及第五个卷积层之后的。ReLU 接在每一个卷积层之后以及全连接层之后。ReLU是在归一化之前的,卷积核的维度等于输入特征图的通道数,卷积核的个数等于输出特征图的通道数。

4. 数据增强

4.1 数据增强

4.1.1 方法一

在这里插入图片描述
第一种方法是对生成图像以及水平的翻转。从256x256的图像中取出224x224大小的图像,这使得训练集的大小增大了2048倍,虽然数据是独立的,但是没有这个操作的话,我们的网络会过拟合。在测试阶段,我们从256x256的图像中选取了4个边角位置,1个中心位置的224x224的patch,并进行水平翻转,这样就得到了10个patch,将它们送入网络进行预测,并计算平均值。

4.1.2 方法二

在这里插入图片描述
在这里插入图片描述
在整个ImageNet训练集中对RGB像素值集执行PCA。PCA(主成分分析),PCA 颜色增强的大概含义是,比如说,如果你的图片呈现紫色,即主要含有红色和蓝色,绿色很少,然后 PCA 颜色增强算法就会对红色和蓝色增减很多,绿色变化相对少一点。顾名思义就是对主要的成分起作用。
https://www.codenong.com/78de8ccd09dd2998ddfc/(PCA数据增强)
https://blog.csdn.net/CSDNJERRYYAO/article/details/120068107(PCA数据增强)
https://www.cnblogs.com/zhangleo/p/16076052.html(PCA数据增强)

4.2 Dropout

4.2.1 神经元的概念

一个完整的神经元有两部分组成,一部分是线性函数,还有一部分是激活函数。
在这里插入图片描述

4.2.2 感受野

感受野的定义是:卷积神经网络每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小。
在这里插入图片描述

4.2.2.1 从前向后计算感受野的公式:

l 0 = 1 , S 0 = 1 l 1 = K 1 l k = l k − 1 + f k − 1 ∗ ∏ i = 0 k − 1 ∗ S i , k ≥ 2 l_0=1,S_0=1\\ l_1=K_1\\ l_k=l_{k-1}+f_k-1*\prod_{i=0}^{k-1}*S_i , k\ge2 l0=1,S0=1l1=K1lk=lk1+fk1i=0k1Si,k2
其中, l k l_k lk:表示第k层的感受野, l k − 1 l_{k-1} lk1:表示第 k − 1 {k-1} k1层的感受野, f k f_k fk:表示第k层卷积核的大小, S i S_i Si:表示第 i i i层的步长, K 1 {K_1} K1第一层的卷积核大小

4.2.2.2 从后向前计算感受野的公式:

F ( 0 ) = K f i n a l F ( i ) = ( F ( i + 1 ) − 1 ) ∗ S t r i d e + K F(0)=K_{final}\\ F(i)=(F(i+1)-1)*Stride+K F(0)=KfinalF(i)=(F(i+1)1)Stride+K

其中 F ( i ) F(i) F(i)表示第 i i i层的感受野, F ( i + 1 ) F(i+1) F(i+1)表示第 i + 1 {i+1} i+1层的感受野, S t r i d e Stride Stride表示步长, K K K卷积核大小, K f i n a l K_{final} Kfinal最后一层卷积核的大小。

4.2.2.3 举例

在这里插入图片描述
则从前往后计算的结果为:
在这里插入图片描述
从后向前计算的结果为:
在这里插入图片描述

4.2.2.4 批注

使用堆叠的3x3卷积核的感受野大小等价与使用一个7x7的感受野大小,但是在这种情况下堆叠的3x3卷积核的参数更少。

4.2.3 局部连接和权值共享

权值共享
请添加图片描述
同一个特征图的神经元采用同一个卷积核的参数进行运算,因此他们是权值共享的

局部连接
请添加图片描述
在进行卷积运算的时候,仅对当前参与卷积运算的区域进行连接

4.2.4 dropout 原理及代码

https://blog.csdn.net/qq_37555071/article/details/107801384(dropout原理及代码,写得相当详细)

4.2.4.1批注

这里丢弃的是神经元而非网络的权重

5.实现细节

主要交代了具体的超参数的设置,动量为0.9,权重衰减为0.0005,作者在这个过程中发现权重衰减非常重要,随后作者交代了一个权重初始化。所有的层使用相同的学习率,初始学习率为0.01,每三个回合衰减一次,总共迭代了大概90个epoch

相关代码

(1)pytorch官方实现的AlexNet,移除了LRN,通道数也有一些不一样
https://github.com/pytorch/vision/blob/main/torchvision/models/alexnet.py
(2)paper with code 对AlexNet的实现
https://github.com/dansuh17/alexnet-pytorch/blob/d0c1b1c52296ffcbecfbf5b17e1d1685b4ca6744/model.py#L40

class AlexNet(nn.Module):
    """
    Neural network model consisting of layers propsed by AlexNet paper.
    """
    def __init__(self, num_classes=1000):
        """
        Define and allocate layers for this neural net.
        Args:
            num_classes (int): number of classes to predict with this model
        """
        super().__init__()
        self.net = nn.Sequential(
            nn.Conv2d(in_channels=3, out_channels=96, kernel_size=11, stride=4,padding=2),  # (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),
        )

    def forward(self, x):
        """
        Pass the input through the net.
        Args:
            x (Tensor): input tensor
        Returns:
            output (Tensor): output tensor
        """
        x = self.net(x)
        x = x.view(-1, 256 * 6 * 6)  # reduce the dimensions for linear layer input
        return self.classifier(x)

遗留问题

卷积和池化过程中的越界问题怎么处理

参考文献

https://blog.csdn.net/sunshine_youngforyou/article/details/99767600
https://blog.csdn.net/qq_45843546/article/details/124331168
http://www.datalearner.com/blog/1051558919769185(写得很不错)
https://blog.csdn.net/qq_45843546/article/details/124331168
https://wap.sciencenet.cn/blog-3428464-1255252.html(局部连接和权值共享)
https://www.jianshu.com/p/b070053a5fec(神经元的概念)
https://zhuanlan.zhihu.com/p/434773836(局部响应归一化)
https://towardsdatascience.com/difference-between-local-response-normalization-and-batch-normalization-272308c034ac(局部响应归一化)
https://zhuanlan.zhihu.com/p/349527410(局部响应归一化以及AlexNet源码实现)
https://blog.csdn.net/qq_37555071/article/details/107801384(dropout原理及代码)
https://www.codenong.com/78de8ccd09dd2998ddfc/(PCA数据增强)
https://blog.csdn.net/CSDNJERRYYAO/article/details/120068107(PCA数据增强)
https://www.cnblogs.com/zhangleo/p/16076052.html(PCA数据增强)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蚂蚁SEO强引蜘蛛是什么

强引蜘蛛在网页中是指一些特殊类型的网页,这些网页具有极高的吸引力和价值,能够吸引搜索引擎蜘蛛(Spider)的强烈关注和抓取。强引蜘蛛的网页通常具有以下特点: 如何联系蚂蚁seo? baidu搜索:如…

Python开发GUI常用库PyQt6和PySide6介绍之一:概述

Python开发GUI常用库PyQt6和PySide6介绍之一:概述 Python开发GUI有许多选择,下面是常见的选择: Tkinter:Tkinter是Python标准库中的一个GUI工具包,易于学习和使用。它提供了丰富的组件和布局选项,适用于简…

后端相关随机题目记录(1)

目录 后端相关随机题目记录(1) 后端相关随机题目记录(1)Bean的类型以及作用域Bean的生命周期Mysql的底层数据结构RedisHttp和Https区别AOP在项目的应用 自定义注解?请求在spring中的一个流程Nacos与zk的区别SpringMV…

那些年项目中踩的那些坑(二)

目录 一、硬件资源与软件需求不匹配1.1 背景1.2教训 一、硬件资源与软件需求不匹配 1.1 背景 在项目中期需要添加XCP到TDA4的main域中,但是发现所有的八路can中已经有七路can被占用,剩下一路因为没有TJA1045驱动无法使用。 1.2教训 1.软件架构缺失&am…

FPGA时序分析与时序约束(二)——时钟约束

目录 一、时序约束的步骤 二、时序网表和路径 2.1 时序网表 2.2 时序路径 三、时序约束的方式 三、时钟约束 3.1 主时钟约束 3.2 虚拟时钟约束 3.3 衍生时钟约束 3.4 时钟组约束 3.5 时钟特性约束 3.6 时钟延时约束 一、时序约束的步骤 上一章了解了时序分析和约束…

高级桌面编程(一)

前言 学习心得:C# 入门经典第8版书中的第15章《高级桌面编程》 创建控件并设置样式 1 样式 Style WPF 当中我们可以对每一个控件进行完全的自定义。我们可以随意更改控件外观和功能。提供我们能完成这样的效果与控件的样式(Style)有着不可分…

如何实现TensorFlow自定义算子?

在上一篇文章中 Embedding压缩之基于二进制码的Hash Embedding,提供了二进制码的tensorflow算子源码,那就顺便来讲下tensorflow自定义算子的完整实现过程。 前言 制作过程基于tensorflow官方的custom-op仓库以及官网教程,并且在Ubuntu和Mac…

第8次实验:UDP

目的: 来看一下UDP(用户数据报协议)的细节。UDP是整个互联网上使用的一种传输协议。在不需要可靠性的情况下,作为TCP的替代品在互联网上使用。它在你的课文的第6.4节中有所涉及。在做这个实验之前,先复习一下这一部分 …

【精选】计算机网络教程(第7章网络安全)

目录 前言 第7章网络安全 1、公钥 2、私钥 3、数字签名 前言 总结计算机网络教程课程期末必记知识点。 第7章网络安全 1、公私密钥和对称密钥 公私密钥(或非对称密钥)和对称密钥是在密码学中用于加密和解密数据的两种不同的密钥类型。 公私密钥…

MySQL主从复制详解

目录 1. 主从复制的工作原理 1.1. 主从复制的角色 1.2. 主从复制的流程 2. 配置MySQL主从复制 2.1. 确保主服务器开启二进制日志 2.2. 设置从服务器 2.3. 连接主从服务器 2.4. 启动复制 3. 主从复制的优化与注意事项 3.1. 优化复制性能 3.2. 注意复制延迟 3.3. 处理…

Leetcode 376 摆动序列

题意理解: 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 如果是摆动序列,前后差值呈正负交替出现 为保证摆动序列尽可能的长,我们可以尽可能的保留峰值,,删除上下坡的中间值&…

2023.12.17 关于 Redis 的特性和应用场景

目录 引言 Redis 特性 内存中存储数据 可编程性 可扩展性 持久化 支持集群 高可用性 Redis 优势 Redis 用作数据库 Redis 相较于 MySQL 优势 Redis 相较于 MySQL 劣势 Redis 用作缓存 典型场景 Redis 存储 session 信息 Redis 用作消息队列 初心 消息队列的…

redis之五种基本数据类型

redis存储任何类型的数据都是以key-value形式保存,并且所有的key都是字符串,所以讨论基础数据结构都是基于value的数据类型 常见的5种数据类型是:String、List、Set、Zset、Hash 一) 字符串(String) String是redis最基本的类型,v…

175. 电路维修(BFS,双端队列)

175. 电路维修 - AcWing题库 达达是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女翰翰,从而被收留在地球上。 翰翰的家里有一辆飞行车。 有一天飞行车的电路板突然出现了故障,导致无法启动。 电路板的整体…

保姆级 Keras 实现 YOLO v3 二

保姆级 Keras 实现 YOLO v3 二 一. 数据准备二. 从 xml 或者 json 文件中读出标注信息三. K-Means 计算 anchor box 聚类尺寸读出所有标注框尺寸K-Means 聚类 四. 代码下载 上一篇 文章中, 我们完成了 YOLO v3 的网络定义, 相当于完成了前向计算功能, 但此时网络中的参数处于随…

MySQL数据库 函数

目录 函数概述 字符串函数 数值函数 日期函数 流程函数 函数概述 函数是指一段可以直接被另一段程序调用的程序或代码。也就意味着,这一段程序或代码在MysQL中已经给我们提供了,我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即…

前后端传参中遇见的问题

前后端传参经常容易出错,本文记录开发springBootMybatis-plusvuecli项目中出现的传参问题及解决办法 1.前后端没有跨域配置,报错 解决方法:后端进行跨域配置,拷贝CorsConfig类 package com.example.xxxx.config;import org.spr…

k8s-ingress 8

ExternalName类型 当集群外的资源往集群内迁移时,地址并不稳定,访问域名或者访问方式等会产生变化; 使用svc的方式来做可以保证不会改变:内部直接访问svc;外部会在dns上加上解析,以确保访问到外部地址。 …

2024年软件测试入坑指南,新人必看系列

本科非计算机专业,在深圳做了四年软件测试工作,从之前的一脸懵的点点点,到现在会点自动化测试,说一点点非计算机专业人员从事软件测试的心得体会,仅供参考交流。 如果你是非计算机专业,毕业不久&#xff0…

CMOS电源稳压器LDO

一、基本概述 TX6213是一款300mA Low Power LDO,输入电压2.5V~6.5V,输出范围1.0V~3.3V,输出电流300mA,PSRR为75dB 1KHz,压差为220mV IOUT200mA。 二、应用场景 MP3/MP4 Players Cellphones, radiophone, digital ca…