小白眼中的卷积神经网络(CNN)

news2024/9/21 0:51:28

相信和笔者一样爱技术对AI兴趣浓厚的小伙伴们,一定对卷积神经网络并不陌生,也一定曾经对如此“高级”的名字困惑良久。今天让我们一起回顾/学习这玩意到底是什么和为什么呢。

引言

说起CNN,必然会首先想到的是CV吧,而边缘检测可谓是CV中家喻户晓的一种应用场景。以原始图片尺寸为6x6为例,如下图所示,其左半部分是像素值较大,是明亮区域;右半部分像素值较小,为深度区域。中间的分界线即就是要检测的边缘。

那么怎么检测边缘呢? 此时滤波器filter(也叫kernel)出场了,如下图所示,kernel尺寸为3x3。

滤波器filter滑过输入图片,在每个区域处稍做停留,对应元素相乘再相加计算,之后再向其它区域滑动继续计算,直到滑动至原图片的最后一个区域为止。这个过程即为卷积。

在这里插入图片描述

由上图可以看出,输出结果的中间颜色浅,两边颜色深,说明原图的边界已反应出来。因此可以总结出,边缘检测就是通过输入图片与相应滤波器进行卷积运算得以识别。

另外,这里的滑动还涉及到一个基本概念,步长stride,上述示例中,是以stride为1说明,每次滑动一格,共停留了8x8个区域,所以最终输出结果是8x8矩阵。

卷积神经网络CNN

经过上面边缘检测这一具体的目标检测场景的分析,我们也就不难理解,CNN(Convolutional neural network)就是通过各种各样的滤波器filter不断提取图片特征,从局部到整体,进而识别目标。

而在神经网络中,这些filter中的每个数字,就是参数,可通过大量数据训练得到(即深度学习的过程)。

CNN中的基本概念

Padding

如上所述边缘检测的例子中,可以看到,原图片尺寸是10x10,经过filter之后是8x8。如果再做一次卷积运算就是6x6…这样的话会有两个缺点:

  • 每次做卷积操作,输出图片尺寸缩小
  • 角落或边缘区域的像素点在输出中采用较少,因此容易丢掉图像边缘位置的许多信息。

如下图中左上角红色阴影只被一个输出触碰到,而中间的像素点(紫色方框标记)会有许多3x3的区域与之重叠。所以,角落或边缘区域的像素点在输出中采用较少,容易丢掉图像边缘位置的许多信息。

在这里插入图片描述

为了解决这一问题,我们通常采用Padding的方法,在卷积操作之前,先给原图片边缘填充一层像素,
例如,将10x10的图像即可填充为12x12的大小,卷积之后的图片尺寸为8x8,和原始图片一样大,这样便使得原图的边缘区域像素点也可以多次被采用。

选择填充多少像素,通常有两种选择:

  • Same卷积:即如上所述,填充再卷积之后的图片大小与原图片一致。
  • Valid卷积:不进行填充操作,直接卷积。

stride

stride的概念在引言中有提到过,表示过滤器filter在原图片中水平方向和竖直方向每次滑动的长度,也叫步进长度。

假设s表示stride长度,p表示padding长度,原图片尺寸是nxn,过滤器filter尺寸是fxf,则卷积后的图片尺寸为:

在这里插入图片描述

pooling池化

pooling在CNN中的作用是减小尺寸,提高运算速度,减小参数数量,防止模型过拟合,让各个特征更具有健壮性。常见的pooling做法有如下两种:

Max pooling

即在滤波器filter滑动区域内取最大值,而无需卷积运算。数字大意味着可能探测到了某些特定的特征,忽略了其它值,降低了噪声影响,提高了模型健壮性。并且,Max pooling需要的超参数仅为滤波器尺寸f和stride长度s,无需要训练其它参数,计算量较小。

在这里插入图片描述

Average pooling

即在滤波器filter滑动区域内求平均值。

在这里插入图片描述

3通道图片卷积

CV中我们通常要面对的都是彩色图像,包括RGB三个通道。同时,3通道RGB图片对应的滤波器算子也是3通道。

例如10x10的RGB图片,维度就是(10x10x3),分别表示图片的高度(height)、宽度(width)和通道数(channel)。

卷积运算过程

3通道图片的卷积运算与单通道图片的卷积运算基本一致,其过程是将每个单通道(R,G,B)分别与其对应的filter进行卷积运算。如下图所示,以过滤器filter位于原图片左上角为例,过滤器filter有27个参数(3x3x3)。分别取原图6x6x3中红、绿、蓝通道的9个数,与黄色过滤器filter覆盖的对应27个数相乘,得到27个数,再将其相加,即可得到4x4矩阵中左上角的数字,以此类推。

在这里插入图片描述

另外如果使用多个不同的滤波器,则卷积运算会分别输出一个4x4矩阵,二者堆叠在一起,即输出4x4x2的立方体。如下图所示。

在这里插入图片描述

CNN的整体结构

卷积神经网络CNN由输入层、卷积层、Relu、池化层和全连接层组成。如下图所示是一个卷积网络示例,卷积层是卷积网络的第一层,其后跟着其它卷积层或池化层,最后一层是全连接层。
越往后的层识别图像越大的部分,较早的层通常专注于简单的特征(例如颜色和边缘等)。随着图像数据在CNN中各层中前进,它开始识别物体的较大元素或形状,直到最终识别出预期的物体。

在这里插入图片描述

其中,

  • 卷积层:由滤波器filters和激活函数构成,属于CNN的核心层,主要作用是提取样本特征。它由输入数据、filter(或卷积核)和特征图组成。若输入数据是RGB图像,则意味着输入将具有三个维度——高度、宽度和深度。filter的本质是一个二维权重矩阵,它将在图像的感受野中移动,检查特征是否存在。卷积的运算过程如上所述。卷积层一般要设置的超参数包括过滤器filters的数量、步长stride以及Padding的方式(valid or same)以及激活函数等。
  • 池化层:(可参见上文所述) 本质即就是下采样(Downsampling),利用图像局部相关性原理,对图像进行子抽样,在保留有用信息的前提下减小数据处理量,具有一定的防止模型过拟合作用。
  • 全连接层:该层的每一个结点与上一层的所有结点相连,用于将前边提取到的特征综合在一起。通常,全连接层的参数是最多的。

CNN的优势

与传统神经网络相比CNN具有局部连接、权值共享等优点,使其学习的参数量大幅降低,且网络的收敛速度也更快。

  • 局部连接:特征图的每个输出值不需要连接到输入图像中的每个像素值,而只需要连接到应用过滤器filter的感受野,因此卷积层通常被称为“部分连接层”,这种特性也即是局部连接。
  • 权值共享:当卷积核在图像上移动时,其权值是不变的。即为权值共享。

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

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

相关文章

电动车防盗器语音芯片方案——NV020C 直推0.5w喇叭

电动车已经成为了越来越多个人的出行交通便利公交,近几年来各式各样的电动车也在不断更新中,功能也逐渐变多。电动车防盗装置也在逐渐更新换代中,其中电动车电池盒成为有些人窥测的重点对象。部分电动车的电池盒锁结构简单,很容易…

FiftyOne 系列教程(2)使用FiftyOne读取数据集

1. 支持的数据集 1.1. 支持各种常见的数据集格式 docs.voxel51.com/user guide/dataset creation/datasets.html#supported import formats此外,zoo上面有什么数据集,这里就可以加载到对应的数据集Available Zoo Datasets — FiftyOne 0.20.1 document…

终端电阻对CAN总线的影响

在进行CAN总线通信前,应保证正确的总线配置,比如终端电阻。它是影响总线通信的重要组件,下面我们不考虑信号的完整性,只从信号幅度和时间常数方面分析不加终端电阻时的影响。 根据ISO11898-2对终端电阻的取值规定,必须…

八股文大全

八股文大全 1. 基础篇1.1 网络基础1.1.1 TCP 三次握手1.1.2 TCP四次挥手![在这里插入图片描述](https://img-blog.csdnimg.cn/90a6997e8d414c84b499167c99da0397.png)1.1.3 TCP常见面试题 1. 基础篇 1.1 网络基础 1.1.1 TCP 三次握手 三次握手过程: 客户端——发…

Thread线程学习(3) 了解Linux线程中的pthread_cancel()函数

目录 一、了解pthread_cancel()函数 二、使用pthread_cancel()函数的基础示例 三、使用pthread_cancel()函数取消线程的进阶示例 (1) 注意事项 (2) 进阶示例 四、pthread_cancel()函数的扩展内容 (1) 如何定义取消点: (2) 使用pthread_cancel()函数需要谨慎…

电极法测污水常规五参数(PH、电导率、溶解氧、温度、浊度)

检测水质常规五参数的意义: pH:地表水水质中pH值的变化会影响藻类对氧气的摄入能力及动物对食物的摄取敏感度; 电导率:主要是测水的导电性,监测水体中总的离子浓度。包含了各种化学物质、重金属、杂质等等各种导电性物…

vue+elementui+nodejs校园生活信息服务快递系统v62911

语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 学生登录,学生通过填写用户名、密码、权限等信息,输入完成后选择登录即可进入校园快领服务系统 学生登录进入校…

ESP32-C2系列开发板简介

C2是一个芯片采用4毫米x 4毫米封装,与272 kB内存。它运行框架,例如ESP-Jumpstart和ESP造雨者,同时它也运行ESP-IDF。ESP-IDF是Espressif面向嵌入式物联网设备的开源实时操作系统,受到了全球用户的信赖。它由支持Espressif以及所有…

阿里P6经验分享,这8种不同类型的自动化测试框架,你会吗?

以下为作者观点: 在自动化测试中,框架提供了一种组织和执行测试案例的结构化方式。它们提供了一套准则和最佳实践,使测试人员能够编写可重复使用、可维护和可扩展的测试脚本。在这篇文章中,我们将讨论自动化测试中不同类型的框架…

最近火起的 Bean Searcher 与 MyBatis Plus 到底有啥区别?

专属小彩蛋:前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站(前言 - 床长人工智能教程) 福利:taobao扫码赚个零花钱~ Bean Searcher 号称 任…

使用Python爬取给定网页的所有链接(附完整代码)

💂 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 此脚本从给定的网页中…

C++基础讲解第五期(继承、多继承、虚继承、向上转型、同名函数)

C基础讲解第五期 代码中也有对应知识注释,别忘看,一起学习! 一、继承(接第四期)1. const修饰成员函数2. 同名函数3. 继承中的static关键字4. 继承中类型兼容性原则5. 多继承(使用参数初始化列表)&#xff0…

SDN控制器三平面(软件定义网络、OOB)

又名 软件定义网络 软件定义网络SDN(Software Defined Network)是由美国斯坦福大学CLean Slate研究组提出的一种新型网络创新架构,可通过软件编程的形式定义和控制网络,其控制平面和转发平面分离及开放性可编程的特点,被认为是网络领域的一场革命,为新型互联网体系结…

Gitlab----基于Kubernetes安装Gitlab

【原文链接】Gitlab----基于Kubernetes安装Gitlab (1)创建命名空间gitlba kubectl create namespace gitlab(2)然后创建Gitlab用的PVC,编写yaml配置文件如下 kind: PersistentVolumeClaim apiVersion: v1 metadata:…

002 - STM32固件库GPIO(一)操作LED灯

STM32固件库操作LED灯 1、创建板级支持包文件 在User目录下创建LED文件夹,包含bsp_led.c及头文件bsp_led.h,之后在Keil中将bsp_led.c加入 2、程序代码 bsp_led.c #include ".\LED\bsp_led.h" //相对路径访问,可以在工程配置内…

LeetCode 199. 二叉树的右视图

199. 二叉树的右视图 描述 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 示例1 输入:[1,2,3,null,5,null,4] 输出:[1,3,4] 示例2 输入&#xf…

【笔试强训选择题】Day14.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 文章目录…

Linux环境搭建与历史

目录 前言 1.操作系统是什么 2. 为什么我们要选择Linux 3.Linux操作系统发展历史 4.企业应用现状 Linux在服务器领域的发展 Linux在桌面领域的发展 Linux在移动嵌入式领域的发展 Linux在云计算/大数据领域的发展 5.发行版本 6. Linux环境配置 6.1 Linux搭建的方式 …

程序员挣够了钱,到中年你还害怕失业吗?

最近一刷知乎全部都是大龄程序员失业危机 真的有这么可怕吗? 程序员35岁就真的到了瓶颈期? 我不这么认为 挣够了钱,当然不可怕,问题是没挣够啊~!!! 按题主的算法是,大城市薪资1…

C++基础STL-map容器

map容器介绍: 作为关联式容器的一种,map 容器存储的都是 pair 对象,也就是用 pair 类模板创建的键值对。其中,各个键值对的键和值可以是任意数据类型,包括 C基本数据类型(int、double 等&#xff0…