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

CNN(卷积神经网络)--李宏毅deep-learning(起飞!!)

以影像识别为例子:


 当我们要识别猫这个图像(RGB三维图像)的时候,这里的图片由100×100×3的像素构成,我们一般把图像进行拉直成由3个100×100构成的tensor.

接着,我们把此tensor进行输入:

由图像可知,我们输出的x有100*100*3个,假如第一层的neuron有1000个,那么可以知道第一层的全连接输入将达到3*10^7个。这是非常大的,是有必要的吗?


由我们人类自身的观察来看当我们识别某一物体时,我们往往只是观察某些特征点就能够识别出物体是什么。那么我们也可以让神经网络的每一个神经元去识别不同的局部特征,而不用将所有特征(tensor) 进行输入到每一个神经元。通过每一个神经元学习各自的局部特征,最后进行综合,我们应该也能做到对物体的识别(这也是和我们一开始学校deep learning的区别,不是采用数据全连接输入,同时也为引入卷积等知识奠定基础

 


为此,如下图,对于上诉三维图像,我们设置一个3*3*3的局部感受野,将3*3*3的数据进行weights和加bias后输入某一neuron.

PS:这里注意,对于多个感受野,可以重叠,甚至完全重叠;感受野的大小,形状都可以自由设计。只是,我们一般用n*n的矩形感受野(也就是卷积核)

由此,我们就得到了一个经典的东东---卷积核卷积

然而,对于某一局部特征,比如鸟的嘴巴,不同的图片位置不同,所以我们需要对每一个感受野都进行数据输入到专门用来识别的neuron。所以,正是这个原因解释了为什么每个neuron的 conv kernel 需要在图像上进行扫描。

其他点的解释:
①图像中移动扫描的单位距离我们称为stride(步长)。
②图像中每一个感受野需要重叠的原因是:有利于将边缘特征也进行提取。
③当卷积核移动到超出图像时,我们需要对图像进行padding(填充),而不是丢掉,目的也是提取边缘特征。

④识别某一特征的neuron,在不同感受野的,weights是一样的,这种我们称为权值共享。(也就是卷积核的值是一样的,neuron的weights)

⑤对于图像特征提取,一般默认对RGB三通道进行,所以我们一般说卷积核只用说n*n,实际上是n*n*x


所以,对于每一个感受野,会有不同的neuron的kernel对其进行卷积(不同的neuron代表发挥不同的检测识别功能,比如有些检测识别嘴,有些识别爪子) 

而由多个neuron组成的通过kernel提取特征的神经元层,就叫卷积层 

fitter(过滤器)也就是neuron。


而,现在让我们来理解,卷积层是怎么达到提取特征的呢?

这叫要和我们之前深度学习的基础知识联系在一起了,哇塞,太酷了 。

假如有一个neuron的3*3kernel是要来识别某一特征的,该特征在特征矩阵(权值)我们假定为

[1,-1,-1,-1,1,-1,-1,-1,1]

一开始,我们随机对kernel进行赋值,接着我们通过大量数据投喂,利用深度学习的前向传播-->损失值计算-->梯度优化-->反向传播,最终找到满足提取该特征的特征矩阵(也就是我们假定的那个) .
接着,我们便利用该kernei对输入图像进行卷积扫描。(ps:这里我们只考虑一维黑白图像)

卷积出来的值是红色部分,从这里,我们看出,当卷积的值为3时,说明该处是符合我们想要识别特征的最大概率处(都有1,1,1对角),从而达到特征提取的目的。 

这一步,真的醍醐灌顶啊啊啊啊


而我们知道,每一层conv layer有很多个neuron(提取不同特征),也就是很多个kernel(假如有n个),所以对于每一个感受野, 将有n个卷积特征矩阵。也就是每一个感受野都会形成n层channles.

 注意: 我们这里讲的是一张黑白图片(一通道),假如是RGB(三通道)图片,经过卷积后,输出的channel数量还是n层。这是因为一个kernel卷积一般是对三通道进行卷积,卷积之后会把三通道的卷积值进行相加,输出给一个输出通道(neuron)。所以n个kernel卷积后,图片输出的通道数为n。而这个多维的图片我们称之为Feature Map。

这里还要注意,卷积操作的核心是逐通道的加权求和当多次卷积,新卷积层的输入通道数(in_channels)必须与输入特征图的通道数匹配。
也就是 Conv2d(64, 128, kernel_size=3, padding=1)当输入的图片是64通道时,Conv2d函数的第一个参数要写64.


此外,随着卷积深度的增加,特征提取的感受野是不断增大的。

如图,虽然我们第一个卷积时的感受野是3*3,第二次卷积的感受野也是3*3,但是第二层卷积的感受野相对于第一层就是5*5. 


在CNN里面,我们还用到了最大池化(Max pooling)

池化是卷积神经网络(CNN)中一个非常重要的操作,通常放在卷积层之后。它的主要目的不是为了学习特征,而是为了对卷积层输出的特征图(Feature Map)进行下采样(Downsampling)

分为最大池化,平均池化等。
池化前:

池化后:(这里用最大池化)


 所以在CNN中,一般卷积+池化。 


所以,一个完整的CNN如图:

  1. Flatten 层:当特征图的空间尺寸(高度和宽度)减小到一定程度(例如1x1,或者仍然较大但准备输入全连接层时),需要将这个三维的特征图转换成一维的向量。这就是Flatten层的作用。它将所有通道的所有像素值按一定顺序(通常是行优先)展平成一个长向量。
    • 例如,一个尺寸为 7x7x512 的特征图,经过Flatten后会变成一个长度为 7 * 7 * 512 = 25088 的向量。
  2. 全连接层 (Fully Connected Layers):将Flatten后的向量输入到一系列全连接层中。这些层通常用于将前面层提取到的特征进行组合和分类。最后一层全连接层通常输出分类任务的类别概率(使用Softmax激活函数)或回归任务的值。

     So,这就是CNN,哇塞,神经舒畅,太爽了。

    That's all.

 喜欢主包的话,请追番,投币 and 点赞,谢谢~~

 


http://www.dtcms.com/a/284759.html

相关文章:

  • MISRA C-2012准则之常量
  • 【Dv3Admin】传递数据实现查询功能
  • RISC-V和ARM有何区别?
  • 学习日志12 python
  • 云原生技术与应用-Kubernetes架构原理与集群环境部署
  • MySQL详解一
  • 【自用】JavaSE--集合框架(一)--Collection集合体系
  • AC7670模块日志的抓取
  • Redis7 底层数据结构解析
  • 【Elasticsearch】Elasticsearch 快照恢复 API 参数详解
  • SmartX 用户建云实践|富士康:基于榫卯企业云平台构建分布式云,支撑全球多地工厂重要产线
  • 百度搜索引擎蜘蛛IP地址段
  • 数据结构排序算法总结(C语言实现)
  • 低功耗、高性能和高度集成的SoC,32位MCU和各种外围IO芯片XL2417D
  • java常见算法合集
  • Easy ARM2132
  • 线程(三) linux 同步
  • windows内核研究(驱动开发 第一个驱动程序和调试环境搭建)
  • 人工智能概念之八:常见的参数调优方法(交叉验证网格搜索、随机优化、贝叶斯优化、Hyperband优化)
  • 如何优化transceiver芯片的供电
  • 进阶向:智能图像背景移除工具
  • 在CentOS7.9服务器上安装.NET 8.0 SDK
  • 嵌入式时钟系统
  • LLM探针技术有哪些
  • 【图像质量评价指标】图像熵(Image Entropy) —— 熵值饱和现象
  • PySide笔记之信号连接信号
  • AI赋能农业:基于YOLO11的苹果瑕疵检测系统实战分享
  • 在Anaconda Prompt中安装库【保姆教程】
  • lwIP WebSocket 客户端 TCP PCB 泄漏问题分析与解决
  • 时空大数据:数字时代的“时空罗盘“