深度学习--机器学习相关(3)

news/2024/9/19 22:50:59/ 标签: 机器学习, 人工智能
1.K-近邻算法

        KNN 听起来像是某种神经网络的名字,如RNN、CNN  等,其实不然,这是一种经典、简单的分类算法K- 近邻算法(K-Nearest  Neighbor,KNN)。与无监督学习讲解的聚类算法不同,KNN 是一个有监督算法。

        有监督学习是一种学习算法,它从标记的训练数据学习,每个训练示例都包括输入和相应的输出标签。有监督学习的目标是学习出一个映射规则,使得模型能够对新的、未见过的数据做出准确的预测或决策。

        无监督学习涉及无标签数据,模型必须自行发现输入数据中的结构。无监督学习的目标是探索数据的内在性质和分布,以便进行聚类、密度估计、降维等任务。

开始KNN 算法的流程:

(1)计算出这个测试数据与所有训练集中的样本的距离;

(2)对这个距离进行排序,然后选取距离测试数据最近的k 个样本;

(3)对这被选取的k 个样本的标签进行统计,k 个样本中哪一种标签的数量最多,这个 测试数据就属于哪个类别。

整个流程非常的简单,而且模型的准确度也比较高,但是计算量大,尤其是当训练集的数据量是千万级别的时候。

2.模拟退火算法

        模拟退火算法(Simulatied   Annealing,SA)是一种避免局部最优的方法。

3.流形学习

        流形学习是一种对于数据特征本质学习的过程。在特征工程中,有很多高维度的数据,如果在高维度空间直接衡量他们的距离,也可以,但是需要找到一个适合高维度空间的、适合数据特征的距离函数。否则,可以把高维 的特征映射到低维上,然后用低维的距离来表示样本的距离。自编码器(Auto   Encoder)就是一个降维的操作。可以把一个图片的高维数据降维成低维数据。当然流形学习还有一个观点:生成。高维数据冗杂很多,所以通过降维操作来提取数据特征的本质,过滤冗余。高维数据冗杂太多,高维空间中并不是每一个点都是有意义的。 假设要生成手写数字,高维空间中并不是每一个点都对应一张图片,因为有冗杂。所以把高 维数据映射到低维空间中,这样低维空间中的数据较少冗杂,更能体现数据本质,从而低维 空间中的每一个点都是有效的、可以生成图片的。再把低维数据映射回高维中,就可以产生 有意义的图片了。

总之流形学习的思想有:

(1)高维数据之间的距离衡量函数比较困难,不妨映射到低维中用欧氏距离。

(2)高维空间并不是每一个点都有意义,用更能表示本质特征的低维空间来生成有意 义的样本。

(3)降维降低的是冗杂信息,希望保留的是本质特征,所以自编码器的使用其实非常

广泛。

4.端侧神经网络GhostNet(2019)

        GhostNet  基于 Ghost 模块,其特点是不改变卷积的输出特征图的尺寸和通道大小,但是可以让整个计算量和参数数量大幅度降低。简单来说,GhostNet 的主要贡献就是减低计算量、提高运行速度的同时,精准度降低的更少了,而且这种改变,适用于任意的卷积网络, 因为它不改变输出特征图的尺寸。GhostNet 的想法就是,既然有这么多的特征图都 是相似的,那么生成相似的特征图的那部分计算量就是多余的,可以节省。其中,相似的特征图,称为Ghost

        从GhostNet   中可以学到怎么用GhostNet  的基  本思想来降低模型的计算量。下面的内容就会围绕着GhostNet   Ghost-Blockneck  展开。 Ghost-Blockneck  是基于Ghost    Module组件,还有SE   Module Depthwise  卷积。

 Ghost Module是 GhostNet 的主要贡献

class GhostModule(nn.Module):#定义了一个名为 GhostModule 的类,它继承自 PyTorch 的 nn.Moduledef __init__(self,inp,oup,kernel_size=1,ratio=2,dw_size=3,Stride=1,relu=True):#定义了类的初始化函数,接受以下参数#inp:输入通道数,oup:输出通道数,kernel_size:主要卷积层的卷积核大小。#ratio:廉价操作扩展比例,dw_size:廉价操作中深度可分离卷积的卷积核大小。super(GhostModule,self).__init__()self.oup=oup#将输出通道数保存为类的成员变量。init_channels=math.ceil(oup/ratio)#计算初始通道数,这是通过将输出通道数除以比例并向上取整得到的。new_channels=init_channels*(ratio-1)#计算通过廉价操作扩展后的新通道数。#定义了一个序列模块,包含一个卷积层、一个批量归一化层和一个可选的ReLU激活函数。这个序列作为主要卷积操作。self.primary_conv=nn.Sequential(nn.Conv2d(inp,init_channels,kernel_size,Stride,padding=kernel_size//2,bias=False),nn.BatchNorm2d(init_channels),nn.ReLU(inplace=True) if relu else nn.Sequential(),)self.cheap_operation=nn.Sequential(nn.Conv2d(init_channels,new_channels,dw_size,Stride=1,padding=dw_size//2,groups=init_channels,bias=False),nn.BatchNorm2d(new_channels),nn.ReLU(inplace=True) if relu else nn.Sequential(),)def forward(self,x):#定义了前向传播函数。x1=self.primary_conv(x)#将输入 x 通过主要卷积操作x2=self.cheap_operation(x1)#将 x1 的输出通过廉价操作out=torch.cat([x1,x2],dim=1)#将 x1 和 x2 在通道维度上进行拼接,dim 参数指定了要进行操作的维度return out[:,:self.oup,:,:]#返回输出,只保留前 oup 个通道,以确保输出通道数与预期一致

        这里的参数 ratio 是一个重点,体现了特征图中有多少的特征图不是Ghost的比例。例如,生成16个特征图,如果ratio=2,就说明有8个特征图不是Ghost

 5.分 组 卷 

        如果分的组数等于输入特征图的通道数,那么就是Depthwise了,如果分 的组没有那么多,就是一般的分组卷积(Group Convolution)。

        "Depthwise",它指的是深度可分离卷积,这是一种卷积操作,可以分解为两个较小的操作:深度卷积和逐点卷积,从而减少模型的计算复杂度和参数数量。

深度卷积(Depthwise Convolution):在深度卷积中,每个输入通道独立地应用一个卷积核。如果输入有 D 个通道,则有 D 个卷积核。

通道分组:在分组卷积中,输入和输出通道被分成多个组。每个组内的通道只能与该组内的卷积核进行卷积操作。

这是一个二维卷积层

self.cheap_operation=nn.Sequential(nn.Conv2d(init_channels,new_channels,dw_size,Stride=1,#这是一个二维卷积层,init_channels:输入通道数,new_channels:输出通道数,这里通过深度可分离卷积扩展的通道数#dw_size:卷积核的大小,用于深度可分离卷积,卷积的步长设置为1,意味着卷积核每次移动一个像素padding=dw_size//2,groups=init_channels,bias=False),#边缘填充的大小,通常设置为卷积核大小的一半,以保持输出特征图的空间尺寸不变。nn.BatchNorm2d(new_channels),#groups=init_channels:将输入通道分组,每组包含一个通道,并为每组应用一个卷积核。当 groups 等于输入通道数时,这实现了深度可分离卷积nn.ReLU(inplace=True) if relu else nn.Sequential(),
)
#bias=False:不使用偏置项,在神经网络的卷积层中,bias=False 参数指定了在该层中不使用偏置项
# 偏置项是卷积操作中的一个额外参数,它的作用是在应用激活函数之前为每个输出单元添加一个常数,以帮助网络更好地拟合数据。
#这是一个批量归一化层,用于归一化深度可分离卷积的输出,以提高训练的稳定性和速度。它作用于 new_channels 个通道。
#inplace=True 表示在原地进行计算,可以减少内存使用

        参数 groups 就是要分的组数,如果groups  的数值等于输入通道数,那么就是Depthwise的方法。

6.SE Module

SE(Squeeze-and   Excitation)Module SENet 网络提出的 Module,SENet 现在有点过时了,但SENet 的核心 SE Module保留了下来,代码如下:

class SELayer(nn.Module):def __init__(self,channel,reduction=4):#reduction:降维比例,默认为4,用于在全连接层中减少参数数量super(SELayer,self).__init__()self.avg_pool=nn.AdaptiveAvgPlool2d(1)#创建一个自适应平均池化层,它将对每个通道的特征图进行平均,输出一个包含全局空间信息的特征图。self.fc=nn.Sequential(nn.Linear(channel,channel//reduction),nn.ReLU(inplace=True),#nn.ReLU(inplace=True) 是一个激活函数,用于增加非线性nn.Linear(channel//reduction,channel),)def forward(self,x):b,c,_,=x.size()#获取输入特征图 x 的尺寸,其中 b 是批次大小,c 是通道数y=self.avg_pool(x).view(b,c)#通过自适应平均池化层处理输入特征图 x,然后将其重新形状为 (b, c)y=self.fc(y).view(b,c,1,1)#将处理后的特征图 y 通过定义的全连接层序列,然后重新形状为 (b, c, 1, 1),使其可以与原始输入特征图 x 进行逐元素乘法y=torch.clamp(y,0,1)#使用 torch.clamp 函数将 y 的值限制在 [0, 1] 范围内,这通常是为了确保权重在合理的范围内return x*y#将输入特征图 x 与重新校准后的权重 y 进行逐元素乘法,实现通道注意力机制,然后返回结果#SELayer 通过对特征图的全局平均池化和全连接层的处理,学习到每个通道的重要性权重,然后将这些权重应用于原始特征图,以此来增强模型对重要特征的感知能力。# 这种注意力机制在许多现代卷积神经网络架构中被广泛使用

        x×y  就是SE  Module的最终返回值。自适应池化层,可以随便设置池化之后的尺寸,都可以适应。这段代码相当于SE  Module对通道进行了一个权重的评估。有的通道可能重 要,有的通道可能不重要,所以经过这个过程让特征图的每一个通道得到了一个权重值。 如何体现权重值的?就是让通道的每一个值都乘上这个权重值,虽操作简单但是是有效果 SE Module中使用到了全连接层,如果每一层都是用SE   Module的话,可能增加10%  左右的计算量。


http://www.ppmy.cn/news/1521028.html

相关文章

多目标应用:四种多目标优化算法(NSGA2、NSPSO、NSDBO、NSCOA)求解柔性作业车间调度问题(FJSP),MATLAB代码

一、柔性作业车间调度问题 柔性作业车间调度问题(Flexible Job Scheduling Problem, FJSP) 的描述如下:n个工件 { J , J 2 , . . , J n } \{J,J_2,..,J_n\} {J,J2​,..,Jn​}要在 m m m 台机器 { M 1 , M 2 , . . , M m } \{M_1,M_2,..,M_m\} {M1​,M2​,..,Mm​} …

div3 970

Problem - D - Codeforces 关键在于如果是环的话&#xff0c;环中的每一个的值都是一样的 #include<bits/stdc.h> #define int long long using namespace std; signed main(){int nn;cin>>nn;while(nn--){int n;cin>>n;int a[n1],i0;while(i<n)cin>…

com.baomidou.mybatisplus.annotation.DbType 无法引入

com.baomidou.mybatisplus.annotation.DbType 无法引入爆红 解决 解决 ❤️ 3.4.1 是mybatis-plus版本&#xff0c;根据实际的配置→版本一致 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-annotation</artifactId>&…

达梦数据库的系统视图v$sysstat

达梦数据库的系统视图v$sysstat 在达梦数据库&#xff08;DM Database&#xff09;中&#xff0c;V$SYSSTAT 视图提供了关于数据库系统性能和状态的一系列统计信息。这个视图是数据库管理员&#xff08;DBA&#xff09;用来监控和管理数据库性能的重要工具之一。它包含许多统计…

不管夫妻还是情人,想要长相厮守、生活幸福美满,就这两个字!

你好&#xff0c;我是腾阳。 近年来&#xff0c;娱乐圈频传“闪婚闪离”的消息&#xff0c;每一次都牵动着公众敏感的神经。 从光鲜亮丽的荧幕情侣到分道扬镳的路人&#xff0c;他们的故事如同一面镜子&#xff0c;映照出现代人情感关系的脆弱与浮躁。 相比之下&#xff0c;…

【Google Play】高德地图13.20.0.1451最新国际版(如何鉴别是否官方?)

高德地图&#xff0c;您的全方位出行助手&#xff0c;让您无论走到哪里都能熟悉一切。无论是寻找美食还是探索旅游景点&#xff0c;高德地图都能为您提供详尽的信息。有了高德地图在手&#xff0c;您可以轻松畅游世界各地&#xff0c;享受无忧无虑的旅行体验。 提供包括驾车、公…

基于 Konva 实现Web PPT 编辑器(二)

动画系统 为了实现演示中复杂的动画效果&#xff0c;使用 Animation 类统一管理&#xff1b;切换动画通过 css animation 实现&#xff0c;并且是应用在 konvajs-content 上&#xff0c;动画则通过 gsap 实现&#xff0c;应用在 Konva.Node 上&#xff0c;实现思路如下&#xf…

Python-FLASK上传文件

一、HTML文件 1、avator.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <form method"post" enctype"multipart/form-dat…

【游戏安全】CheatEngine基础使用——表面加密的原理、如何破解表面加密?如何解决每次关掉程序找到的属性都会消失这个问题?指针扫描

游戏安全 表面加密原理 指针扫描原理 表面加密 原理 从之前的文章中可以知道&#xff0c;这个游戏中是单浮点类型的数据&#xff0c;进行扫描后发现了这么多&#xff0c;对数据进行修改后看效果。 可以看到数据被改为999&#xff0c;这里消耗一次要500&#xff0c;所以点完之…

【Python 千题 —— 算法篇】词频统计

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 在日常开发和文本处理工作中,单词计数是一个非常基础但又极为重要的操作。无论是统计一篇文章的词频,还是分析一段文本的关键词,单词计数都起着关键作用…

AI语音机器人:通过 Azure Speech 实现类人类的交互

语音对话的重要性 在竞争日益激烈的客户互动领域&#xff0c;人工智能语音对话正成为重中之重。随着数字参与者的崛起&#xff0c;组织认识到语音机器人的强大力量&#xff0c;它是一种自然而直观的沟通方式&#xff0c;可以提供类似人类的体验&#xff0c;深度吸引用户&#…

Gin框架中的单个路由中间件:深入理解Next与Abort

Gin是一个高性能的Go语言Web框架&#xff0c;它提供了灵活的中间件机制来处理HTTP请求。在Gin中&#xff0c;中间件可以对请求进行预处理和后处理&#xff0c;而c.Next()和c.Abort()是控制请求处理流程的两个关键方法。本文将通过一个示例详细介绍这两个方法的使用和作用。 1.…

关于一个早期的计算机网络的理解

电脑网络这个新鲜玩意儿&#xff0c;到底是怎样的呢&#xff1f; 2017年11月30日星期四&#xff0c; 我以前回答过这个问题&#xff0c; 简单点举个例子来理解&#xff0c;电脑网络就很形象的被说明了&#xff0c; 它本身就是一张网&#xff0c;一张看不见摸不着但还能用得着的…

图像去噪实验:基于全变分(TV)模型的MATLAB实现

一、背景 全变分模型在图像处理领域中被广泛用于去除噪声&#xff0c;同时保持图像边缘的清晰度。 二、实验步骤 图像的读取、噪声添加、去噪处理以及结果的显示。 三、实验仿真结果图 四、结论 全变分模型是一种有效的图像去噪方法&#xff0c;它能够在去除噪声的同时&#…

【WPF动画】

关于 WPF 中 System.Windows.Media.Animation 命名空间下常用动画类的简要介绍、使用方法和适用场景的表格 使用场景解释&#xff1a;示例代码1示例代码2&#xff1a;使用 Storyboard 组合多个动画代码解释应用场景 动画类描述使用示例适用场景DoubleAnimation用于为 double 类…

驱动开发系列17 - PCI总线

一:概述 PCI(外设计算机互连)或PCIe总线是现代计算机的主要组成部分,了解它的工作原理对于理解许多Linux设备驱动程序非常重要。 关于PCI总线本身有很多好的信息(在维基百科和其他地方),而Linux内核中也有关于PCI处理子系统实际实现的文档。然而,这两种现有来源…

云原生 | 在 Kubernetes 中使用 Cilium 替代 Calico 网络插件实践指南!

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 0x00 简述介绍 什么是 Cilium? Cilium 是一款开源软件,它基于一种名为eBPF的新的Linux内核技术提供动力,用于透明地保护使用 Docker 和 Kubernetes 等Linux 容器管理平台中部署的应用程序服务之间的网络连接,Ciliu…

深度解析RAG技术在大模型时代的原理与实践

RAG的概念 QCon北京2024上涉及了很多大模型应用落地场景&#xff0c;出现比较多的应用模式关键词是&#xff1a;AI Agent和RAG&#xff08;RAG也常被在Agent的Cot或是Mutil-Agent协作的流程中&#xff09;。 &#xff0c;那什么是RAG&#xff1f; 本文将基于RAG的核心组件、…

Web攻防之应急响应(二)

目录 前提 &#x1f354;学习Java内存马前置知识 内存马 内存马的介绍 内存马的类型众多 内存马的存在形式 Java web的基础知识&#xff1a; Java内存马的排查思路&#xff1a; &#x1f354;开始查杀之前的需要准备 1.登录主机启动服务器 2.生成jsp马并连接成功 …

Python实现 ElGamal 加密算法

目录 使用 Python 实现 ElGamal 加密算法的博客引言ElGamal 加密算法的工作原理Python 面向对象实现 ElGamal 算法代码解析示例场景&#xff1a;安全消息传输代码解析Python 代码的扩展和优化总结 使用 Python 实现 ElGamal 加密算法的博客 引言 ElGamal 加密算法 是一种基于…