当前位置: 首页 > news >正文

【深度学习基础知识(一):卷积神经网络CNN基础知识】

@深度学习基础知识

深度学习基础知识(一):卷积神经网络CNN基础知识

卷积神经网络CNN基础知识

0、目录

1. CNN卷积神经网络的特点

2. 卷积操作基础知识

    2.1 卷积操作的概念2.2 卷积操作的种类2.3 卷积操作后特征图谱大小计算公式 

3. 池化操作基础知识

	3.1 池化操作的作用/为什么要进行池化操作?3.2 池化操作的种类3.3 池化操作后特征图谱大小计算公式	 

1、CNN卷积神经网络的特点

  • CNN的使用范围是具有局部空间相关性的数据,比如图像、自然语言、语音。
  • 局部连接(稀疏连接):可以提取局部特征
  • 权值共享:减少参数数量,降低训练难度,避免过拟合,提升模型“平移不变性”
  • 降维:通过池化或卷积stride实现
  • 多层次结构:将低层次的局部特征组合成较高层次的特征,不同层级的特征可以对应不同任务

2、卷积操作基础知识

2.1 卷积操作的概念

  • 卷积操作
    当卷积核在输入图像上扫描时,将卷积核与输入图像中对应位置的数值逐个相乘,最后汇总求和,就得到该位置的卷积结果。不断移动卷积核,就可算出各个位置的卷积结果。
  • 卷积属性
    • 卷积核(Kernel):卷积操作的感受野,直观理解就是一个滤波矩阵,普遍使用的卷积核大小为3×3、5×5等;
    • 步长(Stride):卷积核遍历特征图时每步移动的像素,如步长为1则每次移动1个像素,步长为2则每次移动2个像素(即跳过1个像素),以此类推;
    • 填充(Padding):处理特征图边界的方式,一般有两种,一种是对边界外完全不填充,只对输入像素执行卷积操作,这样会使输出特征图的尺寸小于输入特征图尺寸;另一种是对边界外进行填充(一般填充为0),再执行卷积操作,这样可使输出特征图的尺寸与输入特征图的尺寸一致;
    • 通道(Channel):卷积层的通道数(层数)
  • 卷积操作示意图
    如下图所示,一个卷积核(kernel)为3×3、步长(stride)为1、填充(padding)为1的二维卷积过程:
    在这里插入图片描述
  • 卷积操作计算示意图
    如下图所示,一个33大小的卷积核(矩阵)正在一个55大小的图像(矩阵)进行扫描,根据公式:y=wx进行叠加即可:
    在这里插入图片描述

2.2 卷积操作的种类

  1. 二维卷积(单通道卷积版本)
  • 2D Convolution: the single channel version
  • 只有一个通道的卷积
  • 如下图是一个卷积核(kernel)为3×3、步长(stride)为1、填充(padding)为0的卷积
  1. 二维卷积(多通道版本)
  • 2D Convolution: the multi-channel version

  • 拥有多个通道的卷积,例如处理彩色图像时,分别对R, G, B这3个层处理的3通道卷积,如下图:
    在这里插入图片描述

  • 再将三个通道的卷积结果进行合并(一般采用元素相加),得到卷积后的结果,如下图:

在这里插入图片描述

  1. 三维卷积3D Convolution
  • 卷积有三个维度(高度、宽度、通道),沿着输入图像的3个方向进行滑动,最后输出三维的结果
  1. 1x1卷积
  • 当卷积核尺寸为1x1时的卷积,也即卷积核变成只有一个数字。
  • 1x1卷积的作用在于能有效地减少维度,降低计算的复杂度。
  1. 反卷积 / 转置卷积
  • Deconvolution / Transposed Convolution)
  • 卷积是对输入图像提取出特征(可能尺寸会变小),而所谓的“反卷积”便是进行相反的操作。但这里说是“反卷积”并不严谨,因为并不会完全还原到跟输入图像一样,一般是还原后的尺寸与输入图像一致,主要用于向上采样。
  • 从数学计算上看,“反卷积”相当于是将卷积核转换为稀疏矩阵后进行转置计算,因此,也被称为“转置卷积”
  • 如下图,在2x2的输入图像上应用步长为1、边界全0填充的3x3卷积核,进行转置卷积(反卷积)计算,向上采样后输出的图像大小为4x4。

在这里插入图片描述
6. 空洞卷积(膨胀卷积)

  • Dilated Convolution / Atrous Convolution
  • 为扩大感受野,在卷积核里面的元素之间插入空格来“膨胀”内核,形成“空洞卷积”(或称膨胀卷积),并用膨胀率参数L表示要扩大内核的范围,即在内核元素之间插入L-1个空格。
  • 当L=1时,则内核元素之间没有插入空格,变为标准卷积。 如下图为膨胀率L=2的空洞卷积:
    在这里插入图片描述
  1. 空间可分离卷积(Spatially Separable Convolutions)
  • 空间可分离卷积是将卷积核分解为两项独立的核分别进行操作。一个3x3的卷积核分解如下图:
    在这里插入图片描述
  • 分解后的卷积计算过程如下图,先用3x1的卷积核作横向扫描计算,再用1x3的卷积核作纵向扫描计算,最后得到结果。采用可分离卷积的计算量比标准卷积要少。
    在这里插入图片描述
  1. 深度可分离卷积(Depthwise Separable Convolutions)
  • 深度可分离卷积的方法有所不同。正常卷积核是对3个通道同时做卷积。也就是说,3个通道,在一次卷积后,输出一个数。
  • 深度可分离卷积分为两步:
    (1)用三个卷积对三个通道分别做卷积,这样在一次卷积后,输出3个数。
    (2)这输出的三个数,再通过一个1x1x3的卷积核(pointwise核),得到一个数。所以深度可分离卷积其实是通过两次卷积实现的。
    第一步,对三个通道分别做卷积,输出三个通道的属性:
    在这里插入图片描述

具体运算过程如下:
在这里插入图片描述

第二步,用卷积核1x1x3对三个通道再次做卷积,这个时候的输出就和正常卷积一样,是8x8x1:
在这里插入图片描述

  • 这步就是正常的卷积过程,只是卷积核大小为(3x1x1),一个卷积核得到一个特征图;8x8x3 * 1x1x3x1 => 8x8x1。

  • 深度可分离与普通卷积神经网络的区别

    添加了一个1*1的卷积核
    如果仅仅是提取一个属性,深度可分离卷积的方法,不如正常卷积
    随着要提取的属性越来越多,深度可分离卷积就能够节省更多的参数
    
  • 计算量比较

    默认输入图像大小为D*D
    默认卷积核大小为K*K
    M:输入通道数,N:输出通道数,
    普通卷积 = K * K * M * N * D * D 
    深度可分离卷积 = K *K * M * D * D + M * N * D * D
    优化比例 = (K *K * M * D * D + M * N * D * D)/ (K * K * M * N * D * D)=1/N+1/(K * K)
  • 总结

    ==========
    DSC作为普通卷积的一种替代品,它的最大优点是计算效率非常高。
    因此使用DSC构建轻量级模型是当下非常常见的做法。
    不过DSC的这种高效性是以低精度作为代价的。
    ===========
    

2.3 卷积操作后特征图谱大小计算公式

1.普通卷积

经过某层卷积操作后的特征图大小计算方式:

 ====h1代表输入图像的高度,w1代表输入图像的宽度,k代表卷积核大小,s代表步长====h2、w2分别代表输出的特征图像高度和宽度====h2 = (h1-k+2padding)/s + 1 w2 = (w1-k+2padding)/s + 1 
2.空洞卷积

空洞卷积的等效卷积核大小

h1代表输入图像的高度,k代表卷积核大小,s代表步长,d为diarate参数
h2代表输出的特征图像高度
=====
h2=1+[h1-(k*d-1)+2padding]/s
  • 注意:卷积(除不尽)向下取整,池化(除不尽)向上取整。
3. 常规卷积和深度可分离卷积的参数量
普通卷积:3x3x3x4=1083x3是卷积核尺寸,3是输入图片通道数目,4是输出卷积核的个数。
====================
深度可分离卷积:DW:3x3x3x1=27这里卷积核个数其实只设置为1。会形成3张feature mapPW:1x1x3x4=121x1为卷积核的尺寸,3为上一层feature map的数量,4为最终需要的维度。其实这里我们也得到了4维的feature map。
total: 27+12=39

明显可以看到,深度可分离卷积计算量比普通卷积小很多,只有其近三分之一的计算量。

3. 池化操作基础知识

3.1 池化操作的作用/为什么要进行池化操作?

  • 池化层大大降低了网络模型参数和计算成本,也在一定程度上降低了网络过拟合的风险。概括来说,池化层主要有以下4点作用:

    1.增大网络感受野
    2.抑制噪声,降低信息冗余
    3.降低模型计算量,降低网络优化难度,防止网络过拟合
    4.使模型对输入图像中的特征位置变化更加鲁棒
    

3.2 池化操作的种类

1. Max Pooling(最大池化)

  • 是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。
  • 对于最大池化操作,只选择每个矩形区域中的最大值进入下一层,而其他元素将不会进入下一层。所以最大池化提取特征图中响应最强烈的部分进入下一层,这种方式摒弃了网络中大量的冗余信息,使得网络更容易被优化。
  • 最大池化也常常丢失了一些特征图中的细节信息,所以最大池化更多保留些图像的纹理信息

2. Average Pooling(平均池化)

  • 将输入的图像划分为若干个矩形区域,对每个子区域输出所有元素的平均值。
  • 平均池化取每个矩形区域中的平均值,可以提取特征图中所有特征的信息进入下一层,而不像最大池化只保留值最大的特征,所以平均池化可以更多保留些图像的背景信息

3.Global Average Pooling(全局平均池化)

  • 作用
    在卷积神经网络训练初期,卷积层通过池化层后一般要接多个全连接层进行降维,最后再Softmax分类,这种做法使得全连接层参数很多,降低了网络训练速度,且容易出现过拟合的情况。在这种背景下,M Lin等人提出使用全局平均池化Global Average Pooling来取代最后的全连接层。用很小的计算代价实现了降维,更重要的是GAP极大减少了网络参数(CNN网络中全连接层占据了很大的参数)。

  • 全局平均池化是一种特殊的平均池化,只不过它不划分若干矩形区域,而是将整个特征图中所有的元素取平均输出到下一层。

  • 作为全连接层的替代操作,GAP对整个网络在结构上做正则化防止过拟合,直接剔除了全连接层中黑箱的特征,直接赋予了每个channel实际的类别意义。

  • 使用GAP代替全连接层,可以实现任意图像大小的输入,而GAP对整个特征图求平均值,也可以用来提取全局上下文信息,全局信息作为指导进一步增强网络性能。

    论文地址: https://arxiv.org/pdf/1312.4400.pdf%20http://arxiv.org/abs/1312.4400
    代码链接: https://worksheets.codalab.org/worksheets/0x7b8f6fbc6b5c49c18ac7ca94aafaa1a7
    

4. Mix Pooling(混合池化)

  • 为了提高训练较大CNN模型的正则化性能,受Dropout的启发,Dingjun Yu等人提出了一种随机池化Mix Pooling的方法,随机池化用随机过程代替了常规的确定性池化操作,在模型训练期间随机采用了最大池化和平均池化方法,并在一定程度上有助于防止网络过拟合现象。

  • 其中,是0或1的随机值,表示选择使用最大池化或平均池化,换句话说,混合池化以随机方式改变了池调节的规则,这将在一定程度上解决最大池和平均池所遇到的问题。

  • 混合池化优于传统的最大池化和平均池化方法,并可以解决过拟合问题来提高分类精度

  • 此外该方法所需要的计算开销可忽略不计,而无需任何超参数进行调整,可被广泛运用于CNN。

3.3 池化操作后特征图谱大小计算公式

 ====h1代表输入图像的高度,w1代表输入图像的宽度,k代表卷积核大小,s代表步长====h2、w2分别代表输出的特征图像高度和宽度====h2 = (h1-k) /s + 1 w2 = (w1-k) /s + 1 

相关文章:

【深度学习基础知识(一):卷积神经网络CNN基础知识】

深度学习基础知识 深度学习基础知识(一):卷积神经网络CNN基础知识 卷积神经网络CNN基础知识 0、目录 1. CNN卷积神经网络的特点 2. 卷积操作基础知识 2.1 卷积操作的概念2.2 卷积操作的种类2.3 卷积操作后特征图谱大小计算公式 3. 池化操…...

Git使用入门

一、Git简介 Git 是一个开源的分布式版本控制系统。 Git版本控制的功能为保存不同版本的代码,保存代码的地方叫做仓库。 每个仓库中有多个分支,每个分支上又有很多节点,每个节点代表一个版本,不同的分支可以进行合并&#xff0…...

电机矢量控制算法和例程

电机矢量控制算法是一种高级的电机控制方法,它通过将电机转子空间矢量转换到旋转坐标系中,并在该坐标系中进行控制来实现对电机的精确控制。下面是对电机矢量控制算法的详细解释: 坐标系变换:电机矢量控制首先将电机转子空间矢量变…...

std::string_view概念原理及应用

概念 使用const string&作为参数是先使用字符串字面量编译器会创建一个临时字符串对象然后创建std::string。 或者一个函数提供char*和const string&参数的两个版本函数,不是优雅的解决方案。 于是需要一个只使用内存不维护内存的类。 原理 在visual s…...

lodash库_.chunk、_.pick、_.omit、_.cloneDeep、_.debounce方法

lodash 模块化、高性能的 JavaScript 实用工具库。官方文档:https://www.lodashjs.com 1.对数组进行分组 _.chunk(array, [size1]) 使用场景,如移动端页面一行能放5个元素,总共7条数据,将一维数组转为二维数组,让一个…...

Java使用FFmpeg对视频文件打标记

免安装 FFmpeg <dependency><groupId>ws.schild</groupId><artifactId>jave-all-deps</artifactId><version>3.0.1</version><exclusions><!-- 排除windows 32位系统 --><exclusion><groupId>ws.sch…...

Redux 学习笔记

在使用 React Redux 前&#xff0c;我们首先了解一下 Redux 的一些基础知识。 Redux 是 JavaScript 应用程序中用于状态管理的容器。它不依赖于任何框架&#xff0c;可以与任何 UI 库和框架一起使用。在应用程序中使用 Redux 时&#xff0c;Redux 是以可预测的方式管理状态。 …...

【Bug】8086汇编学习

文章目录 随笔Bug1、masm编译报错&#xff1a;Illegal use of register2、debug中使用段前缀3、[idata]在编译器中的处理4、push立即数报错5、报错&#xff1a;improper operand type6、程序莫名跳转到未知位置 (doing)7、DOSBox失去响应8、程序运行显示乱码9、程序运行导致DOS…...

JetBrains系列IDE全家桶激活

jetbrains全家桶 正版授权&#xff0c;这里有账号授权的渠道&#xff1a; https://www.mano100.cn/thread-1942-1-1.html 附加授权后的一张图片...

洛谷p1618三连击

import java.util.Scanner; //将 1-9 共9个数分成3组&#xff0c;分别组成3个三位数&#xff0c;且使这3个三位数构成A:B:C的比例&#xff0c;试求出所有满足条件的3个三位数。不满足输出“No!!!”。 public class Main {public static void main(String[] args) {Scanner sc …...

微信公众号h5写一个全局调用微信分享功能

1. 首先先安装依赖 npm install weixin-js-sdk --save 2. app.vue文件 <script> export default { onLaunch: function(e) {}, onShow: function(e) { console.log(App Show页面初始); // 路由参数存缓存的 这是为了防止他…...

聊聊精益需求的产生过程

这是鼎叔的第七十八篇原创文章。行业大牛和刚毕业的小白&#xff0c;都可以进来聊聊。 欢迎关注本公众号《敏捷测试转型》&#xff0c;星标收藏&#xff0c;大量原创思考文章陆续推出。本人新书《无测试组织-测试团队的敏捷转型》​​​​​​​​​​​​​​已出版&#xff…...

Linux - 还不懂 gdb 调试器?(调试软件)

前言 当前&#xff0c;我们可以使用 make/makefile 来程序化执行代码文件&#xff1b;可以使用 gcc/g 等编译器来编译代码&#xff1b;可以使用 vim 编辑器来编写代码&#xff1b;其实在 Linux 当中还有一个工具&#xff0c;可以实现调试工作&#xff0c;这个工具就是 -- gdb。…...

Linux:程序地址空间/虚拟地址等相关概念理解

文章目录 程序地址空间虚拟地址和物理地址地址的转换地址空间是什么&#xff1f; 程序地址空间 在C和C程序中&#xff0c;一直有一个观点是&#xff0c;程序中的各个变量等都会有一定的地址空间&#xff0c;因此才会有诸如取地址&#xff0c;通过地址访问等操作&#xff0c;那…...

Python之爬虫

目录 HTTP请求HTTP响应获得页面响应伪装用户访问打包数据爬取豆瓣top250 HTTP请求 HTTP&#xff1a;HypertextTransferProtcol 超文本传输协议 1、请求行 POST/user/info?new_usertrue HTTP/1.1#资源了路径user/info 查询参数new_usertrue 协议版本HTTP/1.1 2、请求头 Ho…...

打造自己的前端组件库(奶妈版,超详细)

打造自己的前端组件库 demo是开源的&#xff0c;自己上npm 或者 github 上都能搜到 新建vue项目(sass js vue2) vue create yt-ui 修改文件目录(如下) 修改&#xff1a; 1.src 更名 examples; 2. src/components移动到项目最外层&#xff1b;3.vue.config.js更改入口文件 /…...

6.调制阶数相关

1、调制阶数与峰均比的关系 调制阶数&#xff08;modulation order&#xff09;对峰均比&#xff08;有一定的影响。 峰均比是用于衡量调制信号或波形在幅度上的动态范围的指标。它表示信号的最大峰值与平均功率之间的比值。较高的峰均比可能导致信号在传输或放大过程中出现过…...

Maven多模块管理(转载)

注意&#xff1a;父模块需设定打包方式为pom https://cloud.tencent.com/developer/article/1667275 dependencyManagement 统一管理子类依赖版本 在父类maven中加入&#xff0c;不会继承给子类&#xff0c;只能规定子类的依赖版本&#xff0c;子类加入dependence后无需写入 …...

运维学习CentOS 7进行Nightingale二进制部署

.因为Nightingale需要MySQL保存一些数据&#xff0c;所以可以参考《CentOS 7.6使用mysql-8.0.31-1.el7.x86_64.rpm-bundle.tar安装Mysql 8.0》部署MySQL。 https://github.com/ccfos/nightingale/releases是可以github上下载Nightingale二进制安装包。 https://n9e.github.io/…...

安装Docker

本安装教程参考Docker官方文档&#xff0c;地址如下&#xff1a;https://docs.docker.com/engine/install/centos/ 卸载旧版 首先如果系统中已经存在旧的Docker&#xff0c;则先卸载&#xff1a; yum remove docker \ docker-client \ docker-client-latest \ docker-common…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

RLHF vs RLVR:对齐学习中的两种强化方式详解

在语言模型对齐&#xff08;alignment&#xff09;中&#xff0c;强化学习&#xff08;RL&#xff09;是一种重要的策略。而其中两种典型形式——RLHF&#xff08;Reinforcement Learning with Human Feedback&#xff09; 与 RLVR&#xff08;Reinforcement Learning with Ver…...

React、Git、计网、发展趋势等内容——前端面试宝典(字节、小红书和美团)

React React Hook实现架构、.Hook不能在循环嵌套语句中使用 , 为什么&#xff0c;Fiber架构&#xff0c;面试向面试官介绍&#xff0c;详细解释 用户: React Hook实现架构、.Hook不能在循环嵌套语句中使用 , 为什么&#xff0c;Fiber架构&#xff0c;面试向面试官介绍&#x…...