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

【图像分类】【深度学习】【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 summaryclass AlexNet(nn.Module):def __init__(self, num_classes=1000, init_weights=False):super(AlexNet, self).__init__()# backbone部分# 卷积层组:conv2d+ReLUself.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+ReLUself.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 xdef _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的偏置置0nn.init.constant_(m.bias, 0)elif isinstance(m, nn.Linear):# FC的权重初始化服从指定均值和标准差的正态分布nn.init.normal_(m.weight, 0, 0.01)# FC的偏置置0nn.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.mzph.cn/news/134323.shtml

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

相关文章

【网络协议】

网络协议 1 网络通讯1.1 防火墙1.2 子网掩码1.3 网关1.4 2 SSH2.1 SSH2.2 SSH12.3 SSH2 3 Telnet4 Telnet/SSL5 NFS6 TFTP7 FTP8 SFTP9 HTTP10 HTTPS11 NAT12 加密 1 网络通讯 1.1 防火墙 所谓“防火墙”,是指一种将内部网和公众访问网(如Internet)分开的方法&…

技术分享 | app自动化测试(Android)-- 属性获取与断言

断言是 UI 自动化测试的三要素之一,是 UI 自动化不可或缺的部分。在使用定位器定位到元素后,通过脚本进行业务操作的交互,想要验证交互过程中的正确性就需要用到断言。 常规的UI自动化断言 分析正确的输出结果,常规的断言一般包…

蓝桥杯练习

即约分数 题目 思路 遍历所有的x&#xff0c;y&#xff0c;判断x/y是不是即越约分数。 代码 #include <iostream> using namespace std; int gcd(int x,int y) {int r;while(y!0){rx%y;xy;yr;}return x; } int main() {// 请在此输入您的代码int sum4039;//1/y和x/1都…

前端食堂技术周刊第 103 期:10 月登陆 Web 平台的新功能、TS 5.3 RC、React 2023 状态、高并发的哲学原理、Web 资源加载优先级

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;夏梦玫珑 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来看下…

深入详解高性能消息队列中间件 RabbitMQ

目录 1、引言 2、什么是 RabbitMQ &#xff1f; 3、RabbitMQ 优势 4、RabbitMQ 整体架构剖析 4.1、发送消息流程 4.2、消费消息流程 5、RabbitMQ 应用 5.1、广播 5.2、RPC VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&am…

Danswer 接入 Llama 2 模型 | 免费在 Google Colab 上托管 Llama 2 API

一、前言 前面在介绍本地部署免费开源的知识库方案时&#xff0c;已经简单介绍过 Danswer《Danswer 快速指南&#xff1a;不到15分钟打造您的企业级开源知识问答系统》&#xff0c;它支持即插即用不同的 LLM 模型&#xff0c;可以很方便的将本地知识文档通过不同的连接器接入到…

webgoat-Sensitive Data Exposure 敏感信息泄露

insecure login不安全的登录 Encryption is a very important tool for secure communication 0x02 点击login&#xff0c;可以看到payload里的username和password&#xff0c;输入后点击submit即可。 这题的目的是说明&#xff0c;信息传输过程中需要加密&#xff0c;如不…

论文阅读——What Can Human Sketches Do for Object Detection?(cvpr2023)

论文&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/papers/Chowdhury_What_Can_Human_Sketches_Do_for_Object_Detection_CVPR_2023_paper.pdf 代码&#xff1a;What Can Human Sketches Do for Object Detection? (pinakinathc.me) 一、 Baseline SBIR Fram…

React动态生成二维码和毫米(mm)单位转像素(px)单位

一、使用qrcode.react生成二维码&#xff0c;qrcode.react - npm 很简单&#xff0c;安装依赖包&#xff0c;然后引用就行了 npm install qrcode.react或者 yarn add qrcode.react直接上写好的代码 import React, {useEffect, useState} from react; import QRCode from qr…

号牌模拟数据生成

说明 自己开发的测试数据生成工具&#xff0c;用于生成数据训练对应模型。 项目 效果

047_第三代软件开发-日志分离

第三代软件开发-日志分离 文章目录 第三代软件开发-日志分离项目介绍日志分离用法 关键字&#xff1a; Qt、 Qml、 log、 日志、 分离 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object Language&#xff09;和 C 的强…

Langchain-Chatchat-win10本地安装部署成功笔记(CPU)

Langchain-Chatchat&#xff08;原Langchain-ChatGLM&#xff09;基于 Langchain 与 ChatGLM 等语言模型的本地知识库问答 | Langchain-Chatchat (formerly langchain-ChatGLM), local knowledge based LLM (like ChatGLM) QA app with langchain。 开源网址&#xff1a;https:…

爬取Elastic Stack采集的Nginx内容

以下是一个简单的Go语言爬虫程序&#xff0c;用于爬取Elastic Stack采集的Nginx内容。请注意&#xff0c;这只是一个基本的示例&#xff0c;实际使用时可能需要根据具体情况进行修改和扩展。 package mainimport ("fmt""net/http""io/ioutil" )…

Servlet详解

一.Servlet生命周期 初始化提供服务销毁 1.测试生命周期 package com.demo.servlet;import javax.servlet.*; import java.io.IOException;public class LifeServlet implements Servlet {Overridepublic void init(ServletConfig servletConfig) throws ServletException {…

layui form 中input输入框长度的统一设置

Layui.form中使用class"layui-input-inline"就可轻松将元素都放到一行&#xff0c;但如果元素过多&#xff0c;就会自动换行。那就需要手动设置input框的长度。 像这种情况&#xff1a; 其实只需要添加css样式就可修改了 .layui-form-item .layui-input-inline {wid…

Javaweb之javascript的详细解析

1.3.2 变量 书写语法会了&#xff0c;变量是一门编程语言比不可少的&#xff0c;所以接下来我们需要学习js中变量的声明&#xff0c;在js中&#xff0c;变量的声明和java中还是不同的。首先js中主要通过如下3个关键字来声明变量的&#xff1a; 关键字解释var早期ECMAScript5中…

【redis】ssm项目整合redis,redis注解式缓存及应用场景,redis的击穿、穿透、雪崩的解决方案

一、整合redis redis是nosql数据库&#xff0c;mysql是sql数据库&#xff0c;都是数据库因此可以参考mysql整合ssm项目的过程。 1.pom依赖 <properties> <redis.version>2.9.0</redis.version><redis.spring.version>1.7.1.RELEASE</redis.spri…

C++——搜索二叉树

作者&#xff1a;几冬雪来 时间&#xff1a;2023年11月7日 内容&#xff1a;C的搜索二叉树讲解 目录 前言&#xff1a; 什么是搜索二叉树&#xff1a; 搜索二叉树的增删查改&#xff1a; 搜索二叉树的定义初始化&#xff1a; 搜索二叉树增操作&#xff1a; 搜索二叉树找…

目前安卓、鸿蒙、澎湃的关系

1、了解AOSP是什么 AOSP全名为Android Open-Source Project&#xff0c;中文为安卓开源项目&#xff0c;开源即开放源代码。Android是一个基于Linux&#xff0c;由Google主导的开源系统。 2、AOSP谁的贡献最大&#xff1f; 3、华为的鸿蒙、小米的澎湃是套壳安卓吗&#xff1…

QGC 中添加海康威视摄像头记录(Qt For Android 使用 JNI 进行JAVA 与 C++ 的通讯)

文章目录 1. 配置海康威视 SDK 下载库文件移植工程文件添加动态库&#xff08;.so&#xff09;Android xml 配置添加 java 文件 2. JavaQGCActivity.javaHkwsManager.java 3. C头文件添加&#xff1a;C 中调用 Java 静态函数&#xff08;hcnNetSDKInit&#xff09;JNI 传入规则…