神经网络必备基础知识:卷积、池化、全连接(通道数问题、kernel与filter的概念)

news2024/11/16 21:21:41

文章目录

  • 卷积操作
  • 实际操作
  • filter与kernel
  • 1x1的卷积层
  • 可视化的例子
  • 池化
  • 全连接

卷积操作

这个不难理解。我们知道图像在计算机中是由一个个的像素组成的,可以用矩阵表示。
假设一个5x5的输入图像,我们定义一个3x3的矩阵(其中的数值是随机生成的)
在这里插入图片描述
然后我们拿这个卷积核,在输入图像里面,选定左上角那个3x3的矩阵,用卷积核与这个矩阵对应的位置相乘,然后得到的9个数,这9个数再相加,最终得到一个结果。
在这里插入图片描述

然后把卷积核往右边挪动一格,继续重复上述计算,再得到一个数字。
在这里插入图片描述
那么算完了,继续往右边挪,再算
在这里插入图片描述

三次计算得到的值是
在这里插入图片描述

然后往下挪一格,继续重复上述操作,直到我们把整个5x5的输入图像全部计算完,得到了9个计算结果
在这里插入图片描述

这就是我们卷积的结果,这整个操作就是卷积操作。
那么有几个问题:

  • Q1:每次往右挪动只能是1格吗?

  • A1:不是,挪动1格,就是步长为1,如果我们设置步长为2,那就每次挪动2格,stride步长由我们设置

  • Q2:卷积核里面的数值是怎么设置的?

  • A2:初始是随机生成的(后面会学习更新)

  • Q3:所以经过卷积之后,图像一定变小了?

  • A3:不是的,上面的例子,5x5的输入,卷积之后得到3x3,那么我们如果给5x5的图像填充一圈,就变成了7x7的图像了,再去拿这个卷积核进行卷积,就会得到5x5的输出。实际中,我们也确实是这么做的,有一个参数padding即表示是否填充,我们可以设置填充的范围,以及填充的值,一般填充0。

    顺便补充一个公式:
    假设输入图片为 H x W 卷积核大小为FxF,步长stride=S,padding设置为P(填充的像素数)
    则输出图像的大小=(H - F +2P)/S +1
    

那么,了解了整个卷积的过程,下面这个图就能看懂了。
这个图表示的是输入图像为5x5,卷积核为3x3,步长为1,padding=1,所以得到的输出是5x5
在这里插入图片描述

实际操作

卷积的流程是上面讲的那样,实际写代码的时候,我们可以不用那么麻烦,每一步都自己实现。
框架已经帮我们封装好的对应的函数,我们只需要调用函数,传给他相关参数即可。
我们以pytorch框架为例(tensorflow也差不多)
Conv2d操作时我们需要设置以下参数:
在这里插入图片描述
我们解释几个常用的:

  • in_channels:输入的通道数
  • out_channels:输出的通道数
  • kernel_size:卷积核的大小,类型为int 或者元组,当卷积是方形的时候,只需要一个整数边长即可,卷积不是方形,要输入一个元组表示高和宽。(卷积核不需要你设置,只需要给定大小,里面的值是随机生成的)
  • stride:步长(就是每次挪动几个像素,默认是1)
  • padding:填充几圈,默认是0,不填充(填充的值为0)
  • dilation:控制卷积核之间的间距(设置这个可以做空洞卷积)
  • groups:控制输入和输出之间的连接
  • bias:偏置,是否将一个 学习到的 bias 增加输出中,默认是True
  • padding_mode:设置填充的模式

filter与kernel

这里重点解释以下通道数的问题:
假设一张图片是6x6的,通道数是1(如黑白图像),卷积核大小3x3,步长为1,不填充(padding为0)
我们暂时不考虑out_channels的设置问题,待会再说
也就是说现在的参数设置是:in_channels=1 kernel_size=3 stride=1 padding=0
这我们都能算出来,输出图像是4x4的,我画了个示意图,可以看下:
在这里插入图片描述
那我们也知道,rgb图像是三通道的,那么假如上图是个rgb图像呢,输出结果是多少呢
也就是说参数设置是:in_channels=3 kernel_size=3 stride=1 padding=0
如图:我们的输出结果依然是1通道的。
在这里插入图片描述
可以看到,这里的卷积核变了,变成了三个叠加。
有些同学就是只明白上面那个单通道的卷积操作,但是不明白这个多通道的卷积操作。
当你输入图像是三通道的时候,卷积核就也是三通道的。
其实关键点就在于in_channelsin_channels是输入的通道数,同时它也是滤波器(filter)的通道数。
kernel我们叫做卷积核,大小是3x3
而如果输入是三通道图像的话,那我们的卷积核也会是三通道的
我们把单层的卷积核叫kernel多层叠起来这个叫filter滤波器

注意:**这样解释并非正确,只是方便理解。**至于kernel和filter的具体含义,有历史原因,这些术语也是从其他学科流传借鉴下来的,而目学习神经网络也并不需要细究kernel和filter具体指代什么,只要理解这都是卷积核就行了。

在这里插入图片描述
当你输入图像是三通道的时候,卷积核就也是三通道的。
他们之间的运算是由这个新的卷积核(有27个数),去和输入图像的对应位置做运算。
27个数分别与输入图像中的27个数字对应相乘,然后再相加,得到一个数,重复这个计算,把整个输入图像都走一遍,就得到16个数。
如图:
在这里插入图片描述
所以运算出来的也是一维的结果,也就是单通道的结果。

所以,kernelfilter的概念就明白了。
kernel: 内核是一个2维矩阵,长 × 宽。
filter:滤波器是一个三维立方体,长× 宽 × 深度, 其中深度便是由 多少张内核构成。
可以说kernel 是filter 的基本元素, 多张kernel 组成一个filter。
其实本质上kernel和filter都是卷积核而已,只不过一个对应单通道,一个对应多通道
所以filter是几维的取决于输入通道数

那么有两个问题:
一个filter 中应该包含多少张 kernel 呢?
答案是:由输入的通道数in_channels来确定
一层中应该有多少个filter呢?
答案是:看我们想要提取多少个特征,一个filter 负责提取某一种特征,我们想输出多少个特征就设置多少个filter。
那么设置filter的参数是什么呢?
就是前面我们没说的out_channels
不要忘了,out_channels也是可以人为设置的,上面那个图,一个filter运算得到的结果是单通道的,假如你设置out_channels=2
那么就会得到输出通道为2。如图所示:
在这里插入图片描述
所以。总结一下就是。
filter有几个决定了输出的通道数
我们写代码的时候,不需要指定filter的数量,而是直接指定输出通道即可,所以输出通道是我们的超参数。
in_channels决定了filter的通道数,out_channels的设置决定了filter的数量,这一层卷积得到的结果的out_channels就是下一层的in_channels
所以,out_channelsin_channels是没有关系的。

1x1的卷积层

1x1的卷积层是特殊的卷积层
卷积核的高和宽都等于1,意味着它不会识别空间信息,因为他每次只看一个空间像素所以不会去识别通道中的空间信息
但是我们经常用它来合并通道
它输出的值等价于将对应的输入位置上的不同通道上的值做加权和
1x1卷积核的作用就是去融合不同通道的信息可以认为是不做空间的匹配,只是在输入层直接做输入通道和输出通道的融合,等价于将整个输入拉成一个向量,通道数等于feature的数量
1x1的卷积层就等价于一个全连接层,不做任何的控制信息,因为全连接层不考虑空间信息它只考虑在特征维度(也就是输入通道维数)的融合

可视化的例子

我们可以用一个实际的网络LeNET5来看一下我们刚才的解释。
在这里插入图片描述
这个输入一张32x32的手写数字图片
6@28x28代表:第一卷积层的输出通道是6,输出大小为28x28
第二个是池化层,通道数不变,还是6,大小减半,变成了14x14
第三个还是卷积层,16通道,大小10x10
然后第四个是池化层,16通道,大小5x5
最后跟两个全连接层
最后是输出结果。

LeNET5第一层是一个卷积层,其输入数据是32x32x1,卷积核大小5x5,步长=1,padding=0,输出为6 @ 28×28
那么,这里输入是单通道的,也就是in_channels=1,那么filter的深度也就是1了,但是输出通道要求是6,也就是out_channels=6
也就是需要6个filter,最终得到6个28x28的图像。
如图:这是整个LeNET5的网络可视化模型,蓝色的那个是32x32的,经过卷积,得到了下一层,也就是黄色的那一层,你可以看到,黄色的那一层是一个立方体,我们可以把他展开看看
在这里插入图片描述
可以看到:展开后确实就是6个28x28的结果
在这里插入图片描述
这个可视化的网站地址是:https://tensorspace.org/index.html

池化

明白了卷积操作,池化就简单多了。池化操作就是用一个kernel,比如3x3的,就去输入图像上对应3x3的位置上,选取这九个数字中最大的作为输出结果。这就叫最大池化。
输出通道=输入通道
(输入多通道的时候,就是每个通道都池化就好了)

在这里插入图片描述

全连接

全连接层一般在卷积神经网络的末尾。他的输入呢是前面卷积池化得到的结果,把结果“展平”,就是把得到的结果矩阵,平铺为一个列向量。那么全连接如何对这个列向量运算呢?
在这里插入图片描述
如图,假设左边的x1,x2,x3就是我们展平后得到的向量,那么我们用 x 1 × w 11 + x 2 × w 21 + x 3 × w 31 = b 1 x_1 \times w_ {11} +x_2 \times w_{21} + x_3 \times w_{31} = b_1 x1×w11+x2×w21+x3×w31=b1
同理,b2也是这么算出来的。这个计算过程可以表示为矩阵运算
在这里插入图片描述

那么这个运算中,只要我们增加w矩阵的列数,就可以得到不同的结果数量。比如w设置为3x3的,那就会得到1x3的结果。所以呢,全连接层输出一列向量,最终得到的结果数量是我们可以定义的。
那么这么做有什么意义呢?
全连接层(fully connected layers,FC)在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用。
这么做可以减少特征位置对分类带来的影响,本来feature map是一个矩阵,所以特征的位置对分类是有影响的,比如识别图像里面的猫,猫在图像的左上角,那么左上角就可以检测到,右下角就检测不到,但是呢,我们那这个二维的矩阵,通过全连接层,整合成一个值输出,这个值就是对猫的预测概率,不论猫在哪,只要概率大,就是有猫。这样做忽略了空间结构特征,增强了鲁棒性。
该文章转载自:https://zpf1900.blog.csdn.net/article/details/122377935

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

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

相关文章

excel图表美化:设置标记样式让拆线图精巧有趣

折线图作为我们平时数据视图化非常常规的表现方式,想必大家已经司空见惯了。折线图很简单,每个人都会做,但是不同的人做出来的折线图却千差万别。大多数人的折线图都是直接插入默认折线图样式生成的,这样的折线图先不说有没有用心…

五、IDEA中创建Web项目

文章目录5.1 创建Web项目5.1.1 创建项目5.1.2 编写Servlet类5.2 手动部署项目5.3 自动部署项目5.3.1 IDEA集成Tomcat5.3.2 IDEA部署JavaWeb项目5.4 war包部署5.4.1 导出war包5.1 创建Web项目 5.1.1 创建项目 1、打开IDEA,单击“New Project”或者通过File–>ne…

Perl语言入门

一、简介 Perl语言是拉里.沃尔(Larry Wall)在1987年开发的一种编程语言,借鉴了C、sed、awk、shell脚本语言以及其他语言的特性,专门用于文本处理。 它可以在各种平台上运行,例如Windows,Mac OS和各种UNIX…

bean生命周期

1.Aware和InitializingBean接口 Aware 接口用于注入一些与容器相关信息,例如 BeanNameAware: 注入bean的名字BeanFactorAware: 注入beanFactor容器ApplicationContextAware: 注入applicationContext容器EmbeddedValueResolverAware: ${} 代码…

爬虫进阶一(基础一)

文章目录简介cookie爬取雪球热帖代理模拟登陆防盗链异步爬虫协程asyncioM3U8HLS爬取seleniumbilibili无头浏览器规避检测MySQLMongoDBRedis简介 这个系列分四部分 基础进阶Scrapy 框架逆向分析实战运用 先补充一些爬虫需要的基础知识和技能预热,爬取个简历模板网站…

浅谈Git

Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理,也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 版本控制 什么是版本控制? 版本控制是一种在开发的过程中用于管理我们对文…

如何评价唐卫国公李靖的战功、军事才能、政治才能?

link 一鞭直渡清河洛Research and no development已关注470 人赞同了该回答个人以为,在军事上,李靖是当之无愧的唐朝第一名将,他用兵如神,精于谋略,无论是在实际的军事指挥上,还是军事理论上,他…

Vue3 中computed计算属性的使用

目录前言:什么是计算属性选项式中的计算属性组合式中的计算属性计算属性和方法的区别:计算属性/计算方法注意事项:总结前言: 目标:现在vue3的使用越来越普遍了,vue3这方面的学习我们要赶上,今天…

银行家算法 源码+实验报告(用了自取)

XIAN TECHNOLOGICAL UNIVERSITY 课程设计报告 实验课程名称 操作系统—银行家算法 专 业:计算机科学与技术 班 级: 姓 名: 学 号: 实验学时: …

小程序03/ uni-app自定义全局组件 、 uni-app项目引入 Uview-ui 框架教程方法 和 Uview框架介绍

一. uni-app自定义全局组件 1.创建组件 注意: 在components文件夹下创建组件 、文件夹名要与文件名保持一致 2.使用组件 注意: 在pages文件夹下任意vue文件、 template标签内使用该组件即可 二.uni-app项目引入Uview-ui框架教程方法 和 Uview框架介绍 (1) Uview介绍: Uvi…

【自学Java】Java运算符

Java运算符 Java运算符 Java 程序是由许多语句组成的,而语句的基本操作单位是表达式与运算符。运算符就是数学中的运算符号,如 、-、*、 / 等等。 Java 中提供了许多的运算符,这些运算除了可以处理一般的数学运算外,还可以处理…

Android---AndroidX

目录 Android 支持库 Android Support Library AndroidX 如何迁移老项目到 AndroidX? 支持库的作用 Android 支持库 Android 支持库是每个Android 应用程序中必不可少的一部分,你会发现它们无处不在。支持库为开发人员提供了将 Android 的最新和最强大功能添加…

《最重要的事,只有一件》笔记——目标不是做得更多,而是让自己需要的事情更少

目录 一、引言 二、书中摘要 1、只做一件事、一次只做一件事 2、专心于一件事不那么容易 3、我们不可能同时专注于两件事 4、平衡工作与生活是无稽之谈 5、怎么做 6、成功的习惯-围绕着你的终极目标 7、找到投入的意义 8、确定优先事务-这要看你目前和将来的打算 9、…

【自然语言处理】【ChatGPT系列】FLAN:微调语言模型是Zero-Shot学习器

FLAN: 微调语言模型是Zero-Shot学习器《Finetuned Language Models are Zero-shot Learners》论文地址:https://arxiv.org/abs/2109.01652 相关博客 【自然语言处理】【ChatGPT系列】FLAN:微调语言模型是Zero-Shot学习器 【自然语言处理】【ChatGPT系列】…

R语言geodetector包基于栅格图像实现地理探测器操作

本文介绍基于R语言中的geodetector包,依据多张栅格图像数据,实现地理探测器(Geodetector)操作的详细方法。 需要说明的是,在R语言中进行地理探测器操作,可以分别通过geodetector包、GD包等2个包实现。其中&…

react18+eslint+prettier 配置

新建项目 create-react-app.cmd react18 --template typescript配置别名 安装 craco npm install craco/craco -D新建 craco.config.js const path require("path"); const resolve (dir) > path.resolve(__dirname, dir); module.exports {// 配置别名web…

Kubernetes:Service

文章目录1、Service 定义1.1、无选择符的服务1.2、Endpoints2、服务发布类型2.1、ClusterIP2.2、NodePort2.3、ExternalName2.4、loadbalancer3、无头服务3.1、有选择符的服务3.2、无选择符的服务4、服务发现4.1、环境变量4.2、DNS5、Service TLSService:将运行在一…

力扣(LeetCode)1801. 积压订单中的订单总数(C++)

优先队列模拟 根据题目描述模拟。 如果该订单是一笔采购订单 buy ,则可以查看积压订单中价格 最低 的销售订单 sell 。提示我们,建立小根堆,维护价格最低的销售订单sell 。 反之亦然,如果该订单是一笔销售订单 sell ,…

【技术分享】戴尔工作站安装Win10+Ubuntu20.04双系统教程与避坑指南

文章目录引言1.安装前的几个注意事项(避坑指南)1.1.有多块硬盘,该如何分配给Win10和Ubuntu系统?1.2.Ubuntu分区应该怎么分?2.系统安装步骤2.1.下载系统镜像2.2.制作U盘启动盘2.3.进入Win10系统分配系统空间2.4.BIOS设置…

强力推荐:关于谷歌ChatGPT模型140个示例的展示与实现功能

目录 1、ChatGPT 介绍与使用简要介绍安装ChatGPT与使用想写出有效的问答吗?使用 ChatGPT 桌面应用程序使用 prompts.chat2、ChatGPT模型140个示例充当 Linux 终端充当英语翻译和改进者担任`position`面试官充当 JavaScript 控制台充当 Excel 工作表充当英语发音帮手充当旅游指…