热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

卷积神经网络(CNN)的原理和我对其的个人理解

文章目录

  • 一、卷积运算
    • 对比数学中的卷积运算
  • 二、**函数
  • 三、池化层
  • 四、输入输出通道
  • 五、参考文章

卷积神经网络,也就是convolutional neural networks (简称CNN)
卷积神经网络的主要核心结构:输入->卷积+**函数->池化->输出

一、卷积运算

卷积神经网络(CNN)原理以及个人理解
盗图1

中间黑色大图就是我们的输入数据。蓝色框就是我们的卷积核所在的位置
左上角为卷积核(大小是3*3)。将卷积核这个“小纸片”,盖到原图的大纸片上,卷积核与原图对应位置的数据作乘法,并写到相应的地方,作为运算的结果。

卷积神经网络(CNN)原理以及个人理解盗图2

整个蓝色框计算结束后,我们会得到一个充满数据的新框框(上分白色小正方形)。然后我们需要对其求**均值**,让这个均值作为这片区域特征的一个代表。

均值只是一种处理方式,也可以使用求和作为区域特征的代表。一样可以实现核心思想:框内每个小格的值越大,和卷积核的特征越符合

新的理解:可以把卷积核当做一个滤波器,传入图像为信号。越符合滤波器(卷积核)的信号(图像),通过卷积核后保留的部分越多(乘积越大)。

卷积神经网络(CNN)原理以及个人理解盗图3
卷积神经网络(CNN)原理以及个人理解盗图4

盖上卷积核,计算对应位置乘积,然后求均值。接下来按照给定的stride(步长)进行卷积核的移动,直到把整个输入都完全覆盖。stride=1,向平移1格
将整个图计算一遍之后,会得到一个特征图(feature map)。特征图是输入通过卷积核运算后,反映特征的所在位置的图。(特征图size必定比输入size小,除非kernel_size = 1)

卷积神经网络(CNN)原理以及个人理解盗图5

在取值(-1,1)的灰度图中,越接近1,表示这片区域的特征越匹特配。越接近-1,和特征的反面越匹配。越接近0,说明和特征的匹配不明显。

卷积神经网络(CNN)原理以及个人理解盗图6 不同的卷积核(滤波器)运算后的结果

对比数学中的卷积运算

卷积的数学公式:
连续:
(fg)(n)=+f(τ)g(nτ)dτ(f*g)(n)=\int ^{+\infty}_ {-\infty} f(\tau) g(n-\tau){\rm d}\tau
离散:
(fg)(n)=+f(τ)g(nτ)dτ(f*g)(n)=\sum ^{+\infty}_ {-\infty} f(\tau) g(n-\tau){\rm d}\tau

PS:关于卷积有意思的解释。卷积的数学意义在于加权叠加。怎么理解呢?
另外一个关于卷积的有意思的解释
看了好多关于卷积的答案,看到这个例子才彻底地理解了这个过程~
关于卷积的一个血腥的讲解
比如说你的老板命令你干活,你却到楼下打台球去了,后来被老板发现,他非常气愤,扇了你一巴掌(注意,这就是输入信号,脉冲),于是你的脸上会渐渐地(贱贱地)鼓起来一个包,你的脸就是一个系统,而鼓起来的包就是你的脸对巴掌的响应,好,这样就和信号系统建立起来意义对应的联系。下面还需要一些假设来保证论证的严谨:假定你的脸是线性时不变系统,也就是说,无论什么时候老板打你一巴掌,打在你脸的同一位置(这似乎要求你的脸足够光滑,如果你说你长了很多青春痘,甚至整个脸皮处处连续处处不可导,那难度太大了,我就无话可说了哈哈),你的脸上总是会在相同的时间间隔内鼓起来一个相同高度的包来,并且假定以鼓起来的包的大小作为系统输出。好了,那么,下面可以进入核心内容——卷积了!
如果你每天都到地下去打台球,那么老板每天都要扇你一巴掌,不过当老板打你一巴掌后,你5分钟就消肿了,所以时间长了,你甚至就适应这种生活了……如果有一天,老板忍无可忍,以0.5秒的间隔开始不间断的扇你的过程,这样问题就来了,第一次扇你鼓起来的包还没消肿,第二个巴掌就来了,你脸上的包就可能鼓起来两倍高,老板不断扇你,脉冲不断作用在你脸上,效果不断叠加了,这样这些效果就可以求和了,结果就是你脸上的包的高度随时间变化的一个函数了(注意理解);如果老板再狠一点,频率越来越高,以至于你都辨别不清时间间隔了,那么,求和就变成积分了。可以这样理解,在这个过程中的某一固定的时刻,你的脸上的包的鼓起程度和什么有关呢?和之前每次打你都有关!但是各次的贡献是不一样的,越早打的巴掌,贡献越小,所以这就是说,某一时刻的输出是之前很多次输入乘以各自的衰减系数之后的叠加而形成某一点的输出,然后再把不同时刻的输出点放在一起,形成一个函数,这就是卷积,卷积之后的函数就是你脸上的包的大小随时间变化的函数。本来你的包几分钟就可以消肿,可是如果连续打,几个小时也消不了肿了,这难道不是一种平滑过程么?反映到剑桥大学的公式上,f(a)就是第a个巴掌,g(x-a)就是第a个巴掌在x时刻的作用程度,乘起来再叠加就ok了,大家说是不是这个道理呢?我想这个例子已经非常形象了,你对卷积有了更加具体深刻的了解了吗?

数学卷积公式和卷积神经网络相关性体现
卷积神经网络中的卷积运算,和数学当中的卷积也是有联系的。卷积之所以能提取特征,是因为输入信号和滤波器(卷积核)的相关性,反映到了输出当中。我想要的特征,反映在卷积核上,输入图片的特征和卷积核越是相似,输出越大(被过滤的越少)

二、**函数

卷积神经网络(CNN)原理以及个人理解盗图7

**函数的目的是进一步的筛选数据特征。举例常见的Relu函数:当x<=0,y=0;x>0,y=x。对于小于0的部分,经过**函数后,被抹除。而大于0的部分,特征的情况得以保留。

三、池化层

池化的目的是为了进一步的减少无关信息,突出有效信息的部分。

以max_pool为例:
max_pool将区域内的最大值进行输出。然后根据设定的ride(步长)进行移动。卷积神经网络(CNN)原理以及个人理解盗图8
卷积神经网络(CNN)原理以及个人理解盗图9

四、输入输出通道

卷积神经网络(CNN)原理以及个人理解盗图10

如图,28*28的原始输入,分成3个通道输出,进入卷积层运算。每个卷积的通道之间互相独立(权重、偏移不共享)。单个卷积通道的权重和偏移量(bias)共享。

输入的通道数取决于上一层。例如原始输入为彩色图时,可以三通道(RGB)作为卷积层的输入通道。若为灰度图,可以一通道输入。

五、参考文章

1.https://zhuanlan.zhihu.com/p/27908027
2.https://blog.csdn.net/bitcarmanlee/article/details/54729807


推荐阅读
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
author-avatar
UIleader
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有