【图像分类】【深度学习】【Pytorch版本】AlexNet模型算法详解

news2024/11/25 16:57:06

【图像分类】【深度学习】【Pytorch版本】AlexNet模型算法详解

文章目录

  • 【图像分类】【深度学习】【Pytorch版本】AlexNet模型算法详解
  • 前言
  • AlexNet讲解
    • 卷积层的作用
    • 卷积过程
    • 特征图的大小计算公式
    • Dropout的作用
    • AlexNet模型结构
  • AlexNet Pytorch代码
  • 完整代码
  • 总结


前言

AlexNet是由多伦多大学的Krizhevsky, Alex等人在《ImageNet Classification with Deep Convolutional Neural Networks【NIPS-2012】》【论文地址】一文中提出的模型,核心思想是使用用一个深度卷积神经网络来进行图片分类,并用dropout这个正则化方法来减少过拟合。
AlexNet的出现标志着神经网络的复苏和深度学习的崛起,成功证明了深度神经网络在大规模图像分类任务中的有效性,为后续的深度学习研究提供了强有力的动力。


AlexNet讲解

卷积层的作用

在卷积神经网络里,卷积层的主要功能是通过卷积操作对输入数据进行特征提取。它使用一组可学习的卷积核(也称为滤波器或卷积矩阵),将卷积核与输入数据进行卷积运算,生成输出特征图。卷积对于提高模型的性能和提取更高层次的抽象特征非常关键。

以下是卷积层在深度学习中的几个重要含义:

  1. 特征提取:卷积层可以学习提取输入数据的局部特征。通过卷积核与输入数据进行卷积运算,卷积层能够识别图像中的边缘、纹理、形状等特征。
  2. 参数共享:卷积层具有参数共享的特性。在卷积层中,每个卷积核的参数被共享给整个输入数据的不同位置,大大减少网络的参数数量,提高模型的效率,并使模型更具鲁棒性和泛化能力。
  3. 空间局部性:卷积层通过局部感受野(receptive field)的方式处理输入数据。每个神经元只连接输入数据中一个小的局部区域,而不是全局连接,能够更好地捕捉输入数据的空间局部性特征。
  4. 下采样:卷积层通常结合池化层来进行下采样操作。池化层可以减小特征图的尺寸,并提取更加抽象的特征。
    通过堆叠多个卷积层,可以构建出深度卷积神经网络(Convolutional Neural Network,CNN),用于解决各种计算机视觉任务(图像分类、目标检测和图像分割)。

卷积过程

在卷积神经网络中,卷积层的实现方式实际上是数学中定义的互相关(cross-correlation)运算,是卷积层中的基本操作,具体的计算过程如图所示:

左边浅紫色的图表示7×7的输入图片(或特征图)矩阵;中间粉红色的图表示3×3卷积核矩阵,后边淡青色的图表示卷积层输出的特征图矩阵。

卷积操作的步骤如下:

  1. 将卷积核与输入矩阵的一个局部区域进行逐元素乘积;
  2. 对乘积结果进行求和,得到输出矩阵的一个元素;
  3. 将卷积核在输入矩阵上移动一个步幅,并重复上述操作,直到覆盖整个输入矩阵;
  4. 重复上述过程,每个卷积核生成一个输出矩阵;

卷积过程描述了卷积操作在深度学习中的数学运算,以下是卷积过程中涉及到的重要概念。

概念描述
卷积核(kernel)卷积核中数值为对图像中与卷积核同样大小的子块像素点进行卷积计算时所采用的权重
卷积计算(convolution)图像中像素点具有强烈的空间依赖性,卷积(convolution)就是针对像素点的空间依赖性来对图像进行处理
特征图(feature map)卷积核的输出结果
填充(Padding)输入矩阵的边缘周围添加额外的边缘元素(通常是0),以控制输出矩阵的尺寸
步幅(Stride)决定了在输入矩阵上卷积核每次移动的距离

特征图的大小计算公式

卷积层输出特征图(矩阵)的大小由以下几个因素决定:

  • 输入矩阵的大小: F h × F w {F_{\rm{h}}} \times {F_{{\rm{w}}}} Fh×Fw
  • 卷积核的大小: k h × k w {k_{\rm{h}}} \times {k_{{\rm{w}}}} kh×kw
  • 步幅的大小: s s s
  • 填充的大小: p a d pad pad

其基本公式为:
输出特征图的高: F h = F h _ p r e v − k h + 2 × p a d s + 1 {F_{\rm{h}}} = \frac{{{F_{{\rm{h\_prev}}}} - {k_{\rm{h}}} + 2 \times pad}}{s} + 1 Fh=sFh_prevkh+2×pad+1,输出特征图的宽: F w = F w _ p r e v − k w + 2 × p a d s + 1 {F_{\rm{w}}} = \frac{{{F_{{\rm{w\_prev}}}} - {k_{\rm{w}}} + 2 \times pad}}{s} + 1 Fw=sFw_prevkw+2×pad+1
以下是padding为1的输入8×8的输入特征特征矩阵,经过步长为2,大小为3×3的卷积核后生成3×3大小的输出特征矩阵:

同理,池化层输出特征图(矩阵)的大小由以下几个因素决定:

  • 输入矩阵的大小: F h × F w {F_{\rm{h}}} \times {F_{{\rm{w}}}} Fh×Fw
  • 卷积核的大小: k h × k w {k_{\rm{h}}} \times {k_{{\rm{w}}}} kh×kw
  • 步幅的大小: s s s

池化层不再对输出特征图进行填充,其基本公式为:
输出特征图的高: F h = F h _ p r e v − k h s + 1 {F_{\rm{h}}} = \frac{{{F_{{\rm{h\_prev}}}} - {k_{\rm{h}}}}}{s} + 1 Fh=sFh_prevkh+1,输出特征图的宽: F w = F w _ p r e v − k w s + 1 {F_{\rm{w}}} = \frac{{{F_{{\rm{w\_prev}}}} - {k_{\rm{w}}}}}{s} + 1 Fw=sFw_prevkw+1
以下是输入4×4的输入特征特征矩阵,经过步长为1,大小为3×3的池化核后生成2×2大小的输出特征矩阵:

卷积神经网络中池化核的大小通常的为2×2

Dropout的作用

Dropout是一种用于深度神经网络的正则化技术,其核心思想是在训练过程中随机地丢弃(置零)网络中的神经元,即随机地关闭一些神经元(或节点)它们以及与下一层神经元之间的连接,以减少神经元之间的共适应性,从而提高模型的泛化能力。

Dropout的特点:

  • 随机关闭神经元:在每个神经元被关闭的概率是相同的,概率是一个给定超参数。
  • 前向传播时的关闭:前向传播过程中,失活的神经元的输出值被设为零。
  • 反向传播时的开启:反向传播过程中,失活的神经元的权重不会被调整,只有真正激活的神经元参与权重更新。
  • 集成学习效果:一种可以集成学习(Ensemble Learning)的方法,因为每次迭代都会随机创建一个不同的子模型,该子模型由丢弃部分神经元后的网络组成,通过平均或投票来集成多个子网络的预测,降低模型的仰角,提高泛化性能。
  • 减少共适应性:神经网络中的神经元往往会相互适应,通过彼此的激活模式来共同处理输入数据。这种共适应性可能导致过拟合,即在训练数据上表现良好,但在测试数据上泛化能力较差,特别是在训练数据稀疏或较小的情况下。Dropout通过随机丢弃神经元,迫使网络在不同子集的神经元中学习并适应数据,从而减少神经元之间的共适应性,有助于提高模型的泛化能力。

AlexNet模型结构

下图是博主根据原论文给出的关于VGGnet模型结构绘制的详细示意图:

layer_namekernel sizekernel numpaddingstrideinput_size
Conv11196243×224×224
Maxpool13-0296×55×55
Conv252562196×27×27
Maxpool23-02256×27×27
Conv3338411256×13×13
Conv4338411384×13×13
Conv5325611384×13×13
Maxpool33-02256×13× 13
FC1-2048--256×1×1
FC2-2048--2048×1×1
FC3-1000--2048×1×1

AlexNet可以分为两部分:第⼀部分 (backbone) 主要由卷积层和池化层(汇聚层)组成,第⼆部分由全连接层 (分类器) 组成。

AlexNet的亮点说明
ReLU激活函数解决了SIgmoid在网络较深时的梯度消失问题,训练时比tanh收敛更快,并且有效防止了过拟合现象的出现。
层叠池化操作池化的步长小于核尺寸,使得输出之间会有重叠和覆盖,可以使相邻像素间产生信息交互和保留必要的联系,提升了特征的丰富性,并且避免平均池化的模糊化效果。
Dropout操作Dropout操作会将概率小于0.5的每个隐层神经元的输出设为0,选择性地将一些神经节点去掉,减少了复杂的神经元之间的相互影响,达到防止过拟合。

AlexNet Pytorch代码

backbone部分

# backbone部分
# 卷积层组:conv2d+ReLU
self.features = nn.Sequential(
            # input[3, 224, 224]  output[96, 55, 55]
            nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=2),
            nn.ReLU(inplace=True),
            # input[96, 55, 55] output[96, 27, 27]
            nn.MaxPool2d(kernel_size=3, stride=2),
            # input[96, 27, 27] output[256, 27, 27]
            nn.Conv2d(96, 256, kernel_size=5, padding=2),
            nn.ReLU(inplace=True),
            # input[256, 27, 27] output[256, 13, 13]
            nn.MaxPool2d(kernel_size=3, stride=2),
            # input[256, 13, 13] output[384, 13, 13]
            nn.Conv2d(256, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            # input[384, 13, 13] output[384, 13, 13]
            nn.Conv2d(384, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            # input[384, 13, 13] output[256, 13, 13]
            nn.Conv2d(384, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            # input[384, 13, 13] output[256, 6, 6]
            nn.MaxPool2d(kernel_size=3, stride=2),
        )

分类器部分

# 分类器部分:Dropout+FC+ReLU
self.classifier = nn.Sequential(
	# 以0.5的概率选择性地将隐藏层神经元的输出设置为零
    nn.Dropout(p=0.5),
    nn.Linear(256 * 6 * 6, 2048),
    nn.ReLU(inplace=True),
    nn.Dropout(p=0.5),
    nn.Linear(2048, 2048),
    nn.ReLU(inplace=True),
    nn.Linear(2048, num_classes),
)

完整代码

import torch.nn as nn
import torch
from torchsummary import summary

class AlexNet(nn.Module):
    def __init__(self, num_classes=1000, init_weights=False):
        super(AlexNet, self).__init__()
        # backbone部分
        # 卷积层组:conv2d+ReLU
        self.features = nn.Sequential(
            # input[3, 224, 224]  output[96, 55, 55]
            nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=2),
            nn.ReLU(inplace=True),
            # input[96, 55, 55] output[96, 27, 27]
            nn.MaxPool2d(kernel_size=3, stride=2),
            # input[96, 27, 27] output[256, 27, 27]
            nn.Conv2d(96, 256, kernel_size=5, padding=2),
            nn.ReLU(inplace=True),
            # input[256, 27, 27] output[256, 13, 13]
            nn.MaxPool2d(kernel_size=3, stride=2),
            # input[256, 13, 13] output[384, 13, 13]
            nn.Conv2d(256, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            # input[384, 13, 13] output[384, 13, 13]
            nn.Conv2d(384, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            # input[384, 13, 13] output[256, 13, 13]
            nn.Conv2d(384, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            # input[384, 13, 13] output[256, 6, 6]
            nn.MaxPool2d(kernel_size=3, stride=2),
        )
        # 分类器部分:Dropout+FC+ReLU
        self.classifier = nn.Sequential(
            # 以0.5的概率选择性地将隐藏层神经元的输出设置为零
            nn.Dropout(p=0.5),
            nn.Linear(256 * 6 * 6, 2048),
            nn.ReLU(inplace=True),
            nn.Dropout(p=0.5),
            nn.Linear(2048, 2048),
            nn.ReLU(inplace=True),
            nn.Linear(2048, num_classes),
        )
        # 对模型的权重进行初始化操作
        if init_weights:
            self._initialize_weights()

    def forward(self, x):
        x = self.features(x)
        x = torch.flatten(x, start_dim=1)
        x = self.classifier(x)
        return x

    def _initialize_weights(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                # Conv2d的权重初始化为服从均值为0,标准差为sqrt(2 / fan_in)的正态分布
                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
                if m.bias is not None:
                    # Conv2d的偏置置0
                    nn.init.constant_(m.bias, 0)
            elif isinstance(m, nn.Linear):
                # FC的权重初始化服从指定均值和标准差的正态分布
                nn.init.normal_(m.weight, 0, 0.01)
                # FC的偏置置0
                nn.init.constant_(m.bias, 0)
if __name__ == '__main__':
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    model = AlexNet().to(device)
    summary(model, input_size=(3, 224, 224))              

summary可以打印网络结构和参数,方便查看搭建好的网络结构。


总结

尽可能简单、详细的介绍了深度可分卷积的原理和卷积过程,讲解了AlexNet模型的结构和pytorch代码。

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

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

相关文章

2.数制与编码

目录 一. 进位计数制 (1)二进制,八进制,十进制,十六进制 (2)二进制,八进制,十六进制的转换 (3)十进制转换成任意进制 (4&#xf…

linux命令screen解决client_loop: send disconnect: Broken pipe

一、SSH连接服务器,client_loop: send disconnect: Broken pipe 最近需要在服务器上运行一个需要跑很久的脚本,但ssh连接的远程服务器的命令窗口经常会报:client_loop: send disconnect: Broken pipe,这个错误是ssh 命令之后没有活…

电路布线问题动态规划详解(做题思路)

对于电路布线问题,想必学过动态规划的大家都很清除。今天就来讲解一下这个动态规划经典题目。 目录 问题描述输入分析最优子结构代码 问题描述 在一块电路板的上、下2端分别有n个接线柱。根据电路设计,要求用导 线(i,π(i))将上端接线柱与下端接线柱相…

家用电脑做服务器,本地服务器搭建,公网IP申请,路由器改桥接模式,拨号上网

先浇一盆冷水! 我不知道其他运营商是什么情况。联通的运营商公网IP端口 80、8080、443 都会被屏蔽掉,想要开放必须企业备案(个人不行)才可以。也就是说,只能通过其他端口进行showtime了。 需要哪些东西? 申…

【鸿蒙软件开发】ArkUI容器组件之Grid(网格布局)

文章目录 前言一、Grid1.1 子组件GridItem是什么子组件接口属性事件示例代码 1.2 接口参数 1.3 属性1.4 Grid的几种布局模式1.5 GridDirection枚举说明1.6事件ItemDragInfo对象说明 1.7 示例代码 总结 前言 Grid容器组件:网格容器,由“行”和“列”分割…

php对字符串中的特殊符号进行过滤的方法

1、使用htmlspecialchars函数&#xff1a;此函数将特殊字符转换为对应的HTML实体。示例代码如下&#xff1a; $str "<script>alert(XSS)</script>"; $filtered_str htmlspecialchars($str); echo $filtered_str; 输出&#xff1a; <script>ale…

四阶龙格库塔与元胞自动机

龙格库塔法参考&#xff1a; 【精选】四阶龙格库塔算法及matlab代码_四阶龙格库塔法matlab_漫道长歌行的博客-CSDN博客 龙格库塔算法 Runge Kutta Method及其Matlab代码_龙格库塔法matlab_Lzh_023016的博客-CSDN博客 元胞自动机参考&#xff1a; 元胞自动机&#xff1a;森林…

线性表(顺序表,单链表,双链表,循环链表,静态链表)

目录 1.线性表的定义1.几个重要的概念2.逻辑结构 2.线性表的基本操作3.顺序表&#xff08;线性表的顺序存储&#xff09;1.静态分配2.动态分配3.顺序表的特点4.顺序表的基本操作1.插入2.删除3.查找1.按位查找2.按值查找 4.链表&#xff08;线性表的链式存储&#xff09;1.单链表…

HackTheBox-Starting Point--Tier 1---Funnel

文章目录 一 题目二 实验过程三 利用SSH隧道3.1 本地端口转发 一 题目 Tags FTP、PostgreSQL、Reconnaissance、Tunneling、Password Spraying、Port Forwarding、Anonymous/Guest Access、Clear Text Credentials译文&#xff1a;FTP、PostgreSQL、侦察、隧道技术、密码喷洒…

【笔记】判断高电平,低电平和方波的几种方法

读取某一个上拉电平信号&#xff0c;它可能输出是低电平&#xff0c;可能是高电平&#xff0c;可能是方波&#xff0c;并且这个方波不知道频率何占空比&#xff0c;那么如何来通过程序来判断呢&#xff1f;高电平和低电平都好说&#xff0c;利用HAL库读取即可&#xff0c;如下&…

在云上jupylab(codelab)常用的shell命令

1、切换当前文件目录位置&#xff1a; %cd /project/train/ 2、删除目标文件夹和文件夹下面的内容&#xff0c;注意这个r是不能少的&#xff1a; !rm -r /project/train/src_repo/dataset 3、创建数据集相关文件夹 !mkdir /project/train/src_repo/dataset 4、复制指定…

Pytorch tensor 数据类型快速转换三种方法

目录 1 通用,简单&#xff0c;CPU/GPU tensor 数据类型转换 2 tensor.type()方法 CPU tensor 数据类型转换 GPU tensor 数据类型转换 3 tensor.to() 方法,CPU/GPU tensor 数据类型转换 1 通用,简单&#xff0c; CPU/GPU tensor 数据类型转换 tensor.double()&#xff1a;…

Educational Codeforces Round 157 (A--D)视频详解

Educational Codeforces Round 157 &#xff08;A--D&#xff09;视频详解 视频链接A题代码B题代码C题代码D题代码 视频链接 Educational Codeforces Round 157 &#xff08;A–D&#xff09;视频详解 A题代码 #include<bits/stdc.h> #define endl \n #define deb(x)…

高频SQL50题(基础版)-2

文章目录 主要内容一.SQL练习题1.577-员工奖金代码如下&#xff08;示例&#xff09;: 2.1280-学生们参加各科测试的次数代码如下&#xff08;示例&#xff09;: 3.570-至少有5名直接下属的经理代码如下&#xff08;示例&#xff09;: 4.1934-确认率代码如下&#xff08;示例&a…

C#,数值计算——偏微分方程,Relaxation的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Relaxation { private Relaxation() { } public static void sor(double[,] a, double[,] b, double[,] c, double[,] d, double[,] e, double[,] f, double[,] u, double rjac) …

大型Bat面试知识总结分享—AMS在Android起到什么作用?简单的分析下Android的源码

面试官: AMS在Android起到什么作用&#xff0c;简单的分析下Android的源码 心理分析&#xff1a;这道题在发生在大多数场景下。面对这道题 很多求职很茫然&#xff0c;不知道该如何说起。AMS本身比较复杂难以理解。工作多年也很难弄清AMS的作用&#xff0c;其实我们大可从以下几…

企业数字化转型与供应链效率-基准回归复刻(2007-2022年)

参照张树山&#xff08;2023&#xff09;的做法&#xff0c;本团队对来自统计与决策《企业数字化转型与供应链效率》一文中的基准回归部分进行复刻。文章实证检验企业数字化转型对供应链效率的影响。用年报词频衡量上市公司数字化转型程度&#xff0c;以库存周转天数来衡量供应…

大数据疫情分析及可视化系统 计算机竞赛

文章目录 0 前言2 开发简介3 数据集4 实现技术4.1 系统架构4.2 开发环境4.3 疫情地图4.3.1 填充图(Choropleth maps)4.3.2 气泡图 4.4 全国疫情实时追踪4.6 其他页面 5 关键代码最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据疫…

西门子S7-200SMART 通过向导实现S7通信的具体组态步骤示例

西门子S7-200SMART 通过向导实现S7通信的具体组态步骤示例 具体步骤可参考以下内容: 打开编程软件STEP7-Micro/WIN SMART在“工具”菜单的“向导”"区域单击"Get/Put"按钮,启动PUT/GET向导, 在弹出的“Get/Put”向导界面种添加操作步骤名称并添加注释。 点…

洛谷P1102 A-B数对 详细解析及AC代码

P1102 A-B数对 前言题目题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题目分析注意事项 代码经典二分&#xff08;O(nlgn)&#xff09;酷炫哈希&#xff08;O(n)&#xff09; 后话额外测试用例样例输入 #2样例输出 #2 王婆卖瓜 题目来源 前言 酷&…