卷积的理解,卷积与通道的关系

news2024/12/23 19:47:51

  • 神经网络中的卷积操作
  • 卷积在图像领域的功能
  • 单通道卷积
  • 多通道卷积(1个卷积核)
  • 多通道卷积(多个卷积核)
  • 总结
  • 扩展 图像处理中的卷积核
    • 恒等(Identity)
    • 边缘检测(Edge detection)
    • 锐化(Sharpen)
    • 盒模糊(Box blur)
    • 高斯模糊(Gaussian blur)

写这篇博文是因为在写 卷积层(Convolutional Layer)类 这篇博文的过程中,遇到了一个问题。

在使用 nn.Conv2d 时,需要 指定卷积核的一些参数,包括输入通道数、输出通道数、卷积核大小、步长等。

这里卷积核大小和步长很容易理解,对通道数的理解参见博文:输入通道数 & 输出通道数 - 理解

那么输出通道数是怎么来的呢?
是根据输入通道数和卷积核得到输出通道数吗?
如果是的,那么是怎么样得到的呢?
如果不是,那么输出通道数难道是自己想设哪个值就设哪个值吗?
我不懂呀 !!!!!!(痛苦面具 * 6)

神经网络中的卷积操作

卷积:卷积是原始图像与卷积核之间的滑动局部加乘计算过程。卷积运算是矩阵的一种哈德马积,不是线性代数中常用的乘积。

请添加图片描述

卷积在图像领域的功能

在图像和计算机视觉领域,卷积其实已经有几十年的发展历史。在传统的计算机视觉和模式识别中,卷积又被称为滤波器(Filter)。卷积就是对信息(信号)进行“过滤”(滤波),它能够“过滤出”我们感兴趣、对我们有用的信息。

对一张图片,进行卷积操作,可以得到很多种神奇的效果。图5来自维基百科,最上面是卷积核是一个单位矩阵,使用单位矩阵对原图进行卷积操作,得到的输出与原图一样;接下来的几个卷积核可以检测到物体边缘,或者进行锐化和模糊。(感叹:卷积好像“美颜”滤镜啊)

在这里插入图片描述

经过多年的研究,人们已经能够设计出不同的核矩阵,对图片进行转换,以达到不同的效果。不过,在深度学习出现之前,卷积核是人工设计的,当然需要消耗大量的时间和精力。

感谢梯度下降和反向传播,深度学习的出现使得不再需要人工设计卷积核。在卷积神经网络里,卷积核在初始化的时候是一些随机值,经过了训练,核矩阵是可以被学习出来的。或者说,卷积核是一些参数,可以通过机器学习训练得到

下图展示了不同的5*5卷积核经过梯度下降法的训练,不断更新变化的过程:

请添加图片描述

单通道卷积

以单通道卷积为例,输入为(1,5,5),分别表示1个通道(可以理解为 input 只有一个特征图),宽为5,高为5。假设一个卷积核大小为3x3,padding=0,stride=1。

卷积过程(对应位置相乘之后再求和)如下:
在这里插入图片描述

卷积内核不断的在图像上进行遍历,最后得到3x3的卷积结果,结果如下:
在这里插入图片描述

多通道卷积(1个卷积核)

以彩色图像为例,包含三个通道,分别表示RGB三原色的像素值,输入为(3,5,5),分别表示3个通道,每个通道的宽为5,高为5。
假设卷积核只有1个,卷积核通道也为3,每个通道的卷积内核大小都是3x3,padding=0,stride=1。

  • 因为要对每一个通道的像素值进行卷积运算,所以每一个卷积核的通道数量必须要与输入通道数量保持一致,这里都是3通道;
  • 因为是一张图像的不同通道,所以不同通道的内核的大小必须一致,这里都是3x3;
  • 3个3x3 内核分别对应图像的3个通道,但是不同通道上的内核的参数并不相同。
  • 每一个通道的像素值与对应的卷积核通道的数值(即内核)进行卷积,因此每一个通道会对应一个输出卷积结果,三个卷积结果对应位置累加求和,得到最终的卷积结果。
  • 最后得到的卷积结果,即输出的特征图 faturemap 是一个通道,因为卷积核只有1个。(这里不理解先继续往下看)
  • 可以这么理解:最终得到的卷积结果是原始图像各个通道上的综合信息结果。实际操作中会添加多个卷积核,因为一个卷积核无法提取训练所满足的特征。

在这里插入图片描述

把上述图像通道放在一起,计算原理过程还是与上面一样,堆叠后的表示如下:

在这里插入图片描述

多通道卷积(多个卷积核)

在上面的多通道卷积(只有1个卷积核)中,输出的卷积结果只有1个通道,把整个卷积的整个过程抽象表示,过程如下:

在这里插入图片描述

即:由于只有一个卷积核,因此卷积后只输出单通道的卷积结果(黄色的块状部分表示一个卷积核,黄色块状是由三个通道堆叠在一起表示的,每一个黄色通道与输入卷积通道分别进行卷积,也就是 channel 数量要保持一致,这里只是堆叠放在一起表示而已)。

那么,如果要卷积后也输出多通道,增加卷积核(filers)的数量即可,示意图如下:

在这里插入图片描述
备注:上面的feature map的颜色,只是为了表示不同的卷积核对应的输出通道结果,不是表示对应的输出颜色。

然后将每个卷积核对应的输出通道结果(feature map)进行拼接,图中共有m个卷积核,则输出大小变为(m * w’ * h’),其中w’、h’表示卷积后的通道尺寸,原始输入大小为(n * w * h)。

总结

  • 卷积核通道个数 = 输入通道个数
  • 卷积核的内核个数 = 卷积核通道个数,一个通道对应一个内核
  • 输出通道个数 = 卷积核个数
  1. 卷积核

权值:

卷积核的值就是待学习的权重参数。

网络训练时,输出的结果会和数据集标签做损失计算,然后把计算得到的损失反向梯度下降去更新卷积核里的每一个参数。所以卷积核里面的参数最终是训练得到的

偏置:

每一个 滤波器 都包括一个偏置参数(bias)。这个偏置参数是该 滤波器 中所有 内核 共享的。最终的卷积结果需要在加上该偏置值。

滤波器与内核的关系:

  • 内核(kernel)是一个二维矩阵,长*宽;
  • 滤波器(filter)也叫卷积核,过滤器。是一个三维立方体,长× 宽 × 深度, 其中深度便是由 多少张内核构成,与输入层的深度一致。

两者之间的关系:可以说 kernel 是 filter 的基本元素, 多张 kernel 组成一个 filter。
详见:

激活:

卷积与偏置加和后的值,还需要再经过激活函数(比如 ReLU)才得到最终特征图上的值,图像一般都选ReLU作为激活函数,因为大于1的时候趋向无穷大,这样反向计算损失的时候不会出现梯度消失的风险。

  1. out_channels

out_channels 表示卷积层中卷积核的数量,也就是提取特征的数量

  • 一个卷积核可以提取一种特定的特征,比如边缘、角落等。

  • 当我们需要从输入数据中提取多种不同的特征时,就需要使用多个卷积核,每个卷积核都可以提取一种不同的特征。

  • out_channels 的数量就是卷积核的数量,即每个卷积核各自生成一个输出特征图,这些特征图汇总起来,就是最终的输出特征图

输出通道数 out_channels 的值 可以根据具体的任务需求和模型设计来确定。

  • 一般来说,out_channels 的数量比较大时,能够提取更多的特征信息,让模型拥有更强的表达能力,但是会增加参数量和计算量,从而降低模型的运行效率;
  • 相反,当输出通道数比较小时,计算速度会比较快,但是可能会导致模型容量不足,无法很好地学习和表达输入数据。

实际中,我们可以通过调整输出通道数,不断尝试和调整以找到一个合适的输出通道数。在深度卷积神经网络中,通常会随着网络深度的增加,逐渐增加输出通道数,以增强网络的特征提取能力。在训练过程中,通过交叉验证等方法来确定最优的超参数(包括输出通道数),从而得到一个最佳的模型。

扩展 图像处理中的卷积核

原图像:

在这里插入图片描述

恒等(Identity)

identity 恒等卷积核如下所示,
在这里插入图片描述

在 identity 卷积核中,只有中心位置 [2, 2] 位置处的权重为 1,其余均为 0,所以在进行卷积运算加权后时,像素只与自己本身位置进行了运算,最后返回的还是原像素的值,所以图像处理后是不变的。

边缘检测(Edge detection)

edge detction(边缘检测)对图像识别中的特征提取是非常有作用的,边缘检测卷积核都有一个共同点,就是能够突出图片矩阵中变化剧烈的位置。矩阵如下所示,三种边缘检测核的效果是越来越明显,主要原因就是加强了卷积核中 [2, 2] 位置处与周围元素的区别,图片中变化剧烈位置的在加权后,数值大的更大,数值小的更小,形成了边缘检测效果。

在这里插入图片描述
比对三个核:

  • 第一个核中的权重左上往右下都是 1、0、1,而右上往左下是-1、0、-1,在进行卷积运算时,对角方向的边缘更容易识别出来;
  • 第二个核中,权重从左往右是 1、-4、1,从上往下也是 1、-4、1,所以水平和垂直方向的边缘更容易识别出来;
  • 第三个核中权重水平垂直和对角都是-1、8、-1,所以水平和倾斜的边缘都容易识别。

锐化(Sharpen)

锐化的本质还是利用的边缘检测的原理,放大 [2, 2] 位置与周围元素的权重的区别。与边缘检测权重和为 0 相比,锐化卷积核中所有权重加起来后的值为 1。当权重和大于 1 时,会整体使图片变亮,小于 1 会变暗,等于 1 就会保留原始亮度,所以锐化卷积核保留了原始图形的亮度,而上述的三个边缘检测核使图像变暗。
在这里插入图片描述

盒模糊(Box blur)

在盒模糊卷积核中,所有位置的权重均为 1/9,所以 [2, 2] 位置处的元素值会以一个相同权重与周围变得更相似,达到均匀模糊的效果。
在这里插入图片描述

高斯模糊(Gaussian blur)

高斯模糊卷积核依赖的是高斯函数,所以卷积核的值是围绕着中心点分布的,离中心点越近,贡献也就越大,所以权重值就越高,二维区域高斯曲线图如下:
在这里插入图片描述
首先列出一个 3×3 的高斯模糊卷积核,中心点权重为 4,离得最近的上下左右权重都是 2,稍远一点的对角位置贡献的权重都是 1,最后除以权重和 16,矩阵和效果如下所示:
在这里插入图片描述
可以发现,因为权重更加聚焦到中心点位置,高斯模糊的效果相比盒模糊要更清晰一些。

再列出 5×5 的高斯模糊卷积核,和 3×3 类似,以中心点画圆,离圆心越远权重越小,最后除以权重和 256,矩阵和效果图如下:

在这里插入图片描述
与 3×3 的高斯模糊对比,由于距离中心点更远的位置也贡献了权重,所以 5×5 要更模糊一些。

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

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

相关文章

2243:Knight Moves

文章目录 题目描述思路1. DFS2. BFS3. 动态规划 解题方法1. DFS2. BFS3. 动态规划 题目描述 题目链接 翻译如下: 注:骑士移动是和象棋里的马一样走的是日字型 你的一个朋友正在研究旅行骑士问题 (TKP),你要找到最短的…

java学习part28线程安全Lock锁方式

138-多线程-线程安全的懒汉式_死锁_ReentrantLock的使用_哔哩哔哩_bilibili 1.lock类变量 2.使用方法 和以前的加锁一样,同步代码前加锁,代码后解锁,就表示锁住了这一块代码。 lock是上面声明的静态常量 3.同步和加锁对比

通义千问 模型学习 和 SDK试用

通义千问-14B-Chat-Int4 模型库 (modelscope.cn) **通义千问-14B(Qwen-14B)**是阿里云研发的通义千问大模型系列的140亿参数规模的模型。Qwen-14B是基于Transformer的大语言模型, 在超大规模的预训练数据上进行训练得到。预训练数据类型多样&#xff0…

2023年第十二届数学建模国际赛小美赛C题雪崩防范求解分析

2023年第十二届数学建模国际赛小美赛 C题 雪崩防范 原题再现: 雪崩是极其危险的现象。现在,我们对雪崩是如何形成的已经有了很好的理解,但是我们还不能详细地预测雪崩发生的原因、时间和地点。村庄和道路可以通过各种方式防止雪崩。避免在脆…

python datetime 获取特定一天的后一天或者后几天

这里写自定义目录标题 1 获取特定天的时间对象 具体时间格式参考:Python time strptime()和strftime()-CSDN博客 import datetimetimer datetime.datetime.strptime(date, "%Y-%m-%d")2 获取下一天或者【下x天】的数据并进行格式转换 # 下一天数据 ne…

编译原理:设计与实现一个简单词法分析器

设计与实现一个简单词法分析。具体内容是产生一个二元式文本文件,扩展名为dyd,可将Java或C程序(测试程序)分解成为一个一个的单词及类型。 (选做:并查“单词符号与种别对照表”得出其种别,用一数字表示。)…

Redis数据结构之压缩列表

压缩列表是Redis为节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构。一个压缩列表可以包含任意多个节点,每个节点可以保存一个字节数组或者整数值。 压缩列表构成 zlbytes: 记录整个压缩列表占用的内存字节数,对压缩列…

【每日一题】1094. 拼车-2023.12.2

题目: 1094. 拼车 车上最初有 capacity 个空座位。车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向) 给定整数 capacity 和一个数组 trips , trip[i] [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi…

Android 缩减、混淆处理和优化应用

为了尽可能减小应用的大小,您应在发布 build 中启用缩减功能来移除不使用的代码和资源。启用缩减功能后,您还会受益于两项功能,一项是混淆处理功能,该功能会缩短应用的类和成员的名称;另一项是优化功能,该功…

eclipse中设置自动补齐代码

eclipse中设置自动补齐代码 01 在window里找到preference 02 在preference里搜索content assist 03 在Java的content assist设置 设置为.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 04 apply and close即可

PyLMKit(3):基于角色扮演的应用案例

角色扮演应用案例RolePlay 0.项目信息 日期: 2023-12-2作者:小知课题: 通过设置角色模板并结合在线搜索、记忆和知识库功能,实现典型的对话应用功能。这个功能是大模型应用的基础功能,在后续其它RAG等功能中都会用到这个功能。功…

Linux基础项目开发1:量产工具——UI系统(五)

前言: 前面我们已经把显示系统、输入系统、文字系统搭建好了,现在我们就要给它实现按钮操作了,也就是搭建UI系统,下面让我们一起实现UI系统的搭建吧 目录 一、按钮数据结构抽象 ui.h 二、按键编程 1.button.c 2.disp_manager…

赤峰学院师资培养管理系统的设计与实现

摘 要 随着我国国民经济建设的蓬勃发展和信息技术的越发成熟,各个行业都在积极使用现代化的管理工具,不断改善企业的服务质量,提高工作效率。对师资培养进行现代化的管理,提高工作效率是师资培养管理系统的一大优点。本文是一篇关…

Aspice(Automotive Software Process Improvement and Capability Determination)

Aspice(Automotive Software Process Improvement and Capability Determination) 1. 引言:ASPICE概述 定义 ASPICE简介:ASPICE(Automotive Software Process Improvement and Capability Determination)…

Qt Creator 11.0.3同时使用Qt6.5和Qt5.14.2

Qt Creator 11.0.3同时使用Qt6.5和Qt5.14.2 概要方法1.打开Qt Creator中的Kit,这里我直接附上几张截图,不同的版本打开位置可能有所不同,总之最终目的是要打开构建套件(Kit)2.可以看到构建套件里面有包含了“构建套件K…

栈顺序存储的实现(详解)

栈是一种数据结构,它具有后进先出(LIFO)的特性。栈可以用来存储一组元素,并且只能在栈顶进行插入和删除操作。栈的基本概念包括: 1. 入栈(push):将元素添加到栈顶的操作。 2. 出栈&…

【halcon】C# halcon 内存暴增

1 读取图片需要及时手动释放 一个6M的图片通过halcon进行加载&#xff0c;大约会消耗200M的内存&#xff0c;如果等待GC回收&#xff0c;而你又在不停的读取图片&#xff0c;你的内存占用&#xff0c;将在短时间内飙升。 2 halcon控件显示图片需要清空。 /// <summary>…

Motion 5 for Mac,释放创意,打造精彩视频特效!

Motion 5 for Mac是一款强大的视频后期特效处理软件&#xff0c;为Mac用户提供了无限的创意可能性。无论你是专业的影视制作人&#xff0c;还是想为个人视频添加独特特效的爱好者&#xff0c;Motion 5都能满足你的需求&#xff0c;让你的视频脱颖而出。 Motion 5提供了丰富多样…

数据链路层之VLAN基本概念和基本原理

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

线程与多线程编程

1. 线程 1.1 概念 线程又可以称为轻量级进程 &#xff0c;在进程的基础上做出了改进。 一个进程在刚刚启动时&#xff0c;做的第一件事就是申请内存和资源&#xff0c;进程需要把依赖的代码和数据&#xff0c;从磁盘加载到内存中这件事是比较耗费时间的&#xff0c;有的业务…