(整理)吊炸天的CNNs,这是我见过最详尽的图解!(上)

article/2025/10/2 7:33:30

之前在CSDN上看到这篇文章,觉得通俗易懂,写的非常好。不过近来再次查看,发现文章的照片莫名其妙的没有了,没有图就根本看不懂了。找到了之前关注的微信公众号:AI传送门 。

在里面找到了这篇文章,决定再把这篇文章重新整理过来。

导读:卷积神经网络(CNNs)在“自动驾驶”、“人脸识别”、“医疗影像诊断”等领域,都发挥着巨大的作用。这一无比强大的算法,唤起了很多人的好奇心。当阿尔法狗战胜了李世石和柯杰后,人们都在谈论“它”。

但是,

 

“它”是谁?

“它”是怎样做到的?

已经成为每一个初入人工智能——特别是图像识别领域的朋友,都渴望探究的秘密。

本文通过“算法可视化”的方法,将卷积神经网络的原理,呈献给大家。教程分为上、下两个部分,通篇长度不超过7000字没有复杂的数学公式,希望你读得畅快。

 

下面,我们就开始吧!

先提一个小问题:

“你是通过什么了解这个世界的?”

当一辆汽车从你身边疾驰而过,你是通过哪些信息知道那是一辆汽车?

“它的材质,速度,发动机的声响,还是什么?”

你可能说不清所以然,但是当你看到下图时,你会第一时间反应出来,“噢,车! ”

å¾ç

为什么你能猜对它?

 

“轮廓”!

——对,我给你看了它的轮廓。

再给你一些七七八八、大小不一的图片,你总能猜对一些。

你是怎样做到的?

很简单

你读了一张图片  找到了图片的特征 → 进而对图片做出了分类

                                                                    å¾ç

其实,CNNs的工作原理也是这样。

 

先不考虑那些复杂的专有名词:什么卷积(convolution)、池化(pooling)、过滤器(filter) 等等…… 统统抛到一边。

 

CNNs做的就是下面3件事:

 

1. 读取图片;

2. 提取特征;

3. 图片分类。

 

下面,我们逐一来看各步骤的细节。

图片

如果是一张黑白图片,我们看到的,是这个样子的:

 

图片

 

而在计算机的眼里,它看到的,是这个样子的:

图片

好没有情趣……

图片

 

这些数字是哪里来的?

因为图片是由一个又一个的像素点构成。(当你将图片无限放大,你能看到那些像素点)

图片

而每一个像素点,都是由一个0~255的数字组成。

图片

所以,在计算机“看”来,一张图片,就是一个又一个的数字。

图片

 

所以,我们第一步的工作,是将左上图的那只小狗,转换成右上图的那一行行数字。

 

幸运的是,目前在python中,很多第三方库,诸如PIL/Matplotlib等,都可以实现这种转换,我们需要了解的是,后面的所有运算过程,都是基于右上图来完成的,至于具体的转换过程,不需要我们费心来做。

 

图片

在文章开篇的例子中,我们知道,在识别一辆汽车的时候,可以将它的轮廓提取出来,从而判断出那是一辆车。

 

同样的,CNNs在识别图片时,也需要提取图像的特征。

 

在CNNs中,完成这一工作的小伙叫“卷积”。(希望你不要纠结这个极具个性的名字,懂得它的原理就OK)

 

“卷积”在每次工作时,手里都会握着几把“过滤器”。

 

图片

 

过滤器的作用是:寻找图片的特征。

 

仍以小狗为例,过滤器会在图片上从头到尾“滑过”一遍

 

图片

 

每滑到一个地方,就将该地方的图像特征提取出来。

 

那它是怎样提取的呢?

 

别忘了,在计算机的眼里,世界是这个样子的:

图片

(为了简化问题,这里将像素值仅用0和1表示)

 

假设过滤器是这个样子的:

图片

 

 

当橘色的过滤器在绿色矩形框中,缓慢滑过时,

我们用橘色过滤器中的每一个值,与绿色矩形框中的对应值相乘、再相加

 

有点儿拗口,直接看图:

 

图片

(点击图片,查看大图)

 

结果“4”,就是我们从第一个橘色方框中,提取出的特征。

 

如果我们每次将橘色过滤器,向右、向下移动1格,则提取出的特征为:

 

图片

 

你可能会问:

 

我知道绿色矩阵代表一张图片,是计算机“眼中”图片的样子。

 

但是,

经过橘色过滤器提取特征后,得到的粉色矩阵,那是什么?

 

 

图片

 

我们从人类的视角,再重新审视一遍。

 

这次,我们回到之前的例子中。

 

仍以这张萌狗为例,它经过“过滤器”提取特征后,得到的是一张……哦,好吧……看起来有点儿模糊的图。

图片

(点击图片,查看大图)

 

虽然图片模糊了,但是图片中的主要特征,已经被过滤器全部提取出来,单凭这么一张模糊的图,作为人类的我们,足以对它做出判断了。(谁敢说它是一只猫?!)

 

下面,我们再换几个过滤器试试。

 

图片

(点击图片,查看大图)

这些就是经过过滤器提取后,得到的不同“特征图片”。

由此我们可以看出,采用不同的“过滤器”,能够提取出不同的图片特征。

 

你可能又会问:

 

那过滤器里的数值,该如何确定呢?

 

这就涉及到CNNs要做的工作了。每一个过滤器中的数值,都是算法自己学习来的,不需要我们费心去设置。

 

需要我们做的有:

① 设置过滤器的大小(用字母“F”表示)

上例中,我们的过滤器大小是3×3,即F=3。

当然,你还可以设置成5×5,都是可以的。

只不过,需要注意的是:过滤器的尺寸越大,得到的图像细节就越少,最终得到的特征图的尺寸也更小。

 

② 设置过滤器滑动的步幅数(用字母“S”表示)

上例中,过滤器滑动的步幅是1,即每次过滤器向右或向下滑动1个像素单位。

当然,你也可以将步幅设置为2或更多,但是通常情况下,我们会使用S=1或S=2。

 

③ 设置过滤器的个数(用字母“K”表示)

上例中,我们分别给大家展示了4种过滤器。所以你可以理解为K=4,如下图:

图片

 

当然,你可以设置任意个数。

再次强调:不要在意过滤器里面的数值,那是算法自己学习来的,不需要我们操心,我们只要把过滤器的个数设置好,就可以了。

 

所以,一张图片,在经过4种过滤器的提取后,会得到4种不同的特征图片:

 

 

实际上,这就是“卷积”小伙儿所做的工作。

 

图片

 

从上面的例子我们能够看到,“卷积”输出的结果,是包含“宽、高、深”3个维度的:

 

图片

 

实际上,在CNNs中,所有图片都是包含有“宽、高、深”。

像输入的图片——萌狗,它也是包含3个维度,只不过,它的深度是1,所以在我们的图片中没有明显地体现出来:

 

图片

 

所以,我们要记住,经过“卷积”层的处理后,图片含有深度,这个“深度”,等于过滤器的个数。

例如,上面我们采用了4种过滤器,那么,输出的结果,深度就为4。

 

④ 设置是否补零(用字母“P”表示)

何为“补零”?

上面的例子中,我们采用了3×3大小的过滤器,直接在原始图片滑过。

从结果中可以看到,最终得到的“特征图片”比“原始图片”小了一圈:

图片

为什么会出现这种情况?

原因很简单:过滤器将原始图片中,每3*3=9个像素点,提取为1个像素点

 

图片

所以,当过滤器遍历整个图片后,得到的特征图片会比原始图片更小。

 

当然,你也可以得到一个和原始图片大小一样的特征图,这就需要采用“在原始图片外围补零”的方法:

图片

 

下面,我们来看看“补零”后的效果:

 

图片

 

从图中可以看到,当我们在原始图片外围补上1圈零后,得到的特征图大小和原始图一样,都是5*5。

 

你可能会问:

 

如何确定“补零”的圈数,才能保证图片大小一致?

 

假设你的过滤器大小为F,滑动步幅S=1,想要实现这一目标,补零的个数应为:

 

图片

举个例子:

在上图中,因为我们使用的是3*3大小的过滤器,而且每次滑动时,都是向右或向下移动1格。

所以,为了使特征图片与原始图片保持一致,需要补零P=(3-1)/2=1,即在原始图片外围,补1圈零。

 

如果你使用的过滤器大小为5*5,那么补零P=(5-1)/2=2,即在原始图片外围,补2圈零。

 

当然,是否需要“补零”,由你自己来决定,“补零”并不是硬性规定。

 

图片 温馨提示:

假设原始图片的大小为W,当我们设置了

过滤器的大小(F)、滑动的步幅数(S)、以及补零的圈数(P)

实际上,得到的特征图片大小为:

 

图片

所以,当我们设置这些超参数时,需要遵循一个原则,即“上面公式得到的结果,必须为一个整数”:

 

图片

 

恭喜你!

看到这里,CNNs中最难的部分我们已经学习完了。

下面,我们会学习“非线性计算”和“池化”。

但它们都很简单,深呼吸,下节课我们继续……

(整理)吊炸天的CNNs,这是我见过最详尽的图解!(下)

 

原文在微信公众号:AI传送门

 


http://chatgpt.dhexx.cn/article/q1gWlGOH.shtml

相关文章

交叉验证

概述Holdout 交叉验证K-Fold 交叉验证Leave-P-Out 交叉验证总结 概述 交叉验证是在机器学习建立模型和验证模型参数时常用的办法。 顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集。 用训练集来训练模型&…

交叉验证评估模型性能

在构建一个机器学习模型之后,我们需要对模型的性能进行评估。如果一个模型过于简单,就会导致欠拟合(高偏差)问题,如果模型过于复杂,就会导致过拟合(高方差)问题。为了使模型能够在欠拟合和过拟合之间找到一个折中方案,我们需要对模型进行评估,后面将会介绍holdout交叉…

Python实现:Hold-Out、k折交叉验证、分层k折交叉验证、留一交叉验证

模型在统计中是极其重要的,可以通过模型来描述数据集的内在关系,了解数据的内在关系有助于对未来进行预测。一个模型可以通过设置不同的参数来描述不同的数据集,有的参数需要根据数据集估计,有的参数需要人为设定(超参…

深度理解hold-out Method(留出法)和K-fold Cross-Validation(k折交叉验证法)

模型评估(Model Evaluation) 1.测试集(testing set) 测试集(testing set): 通常,我们可通过实验测验来对学习器的泛化误差进行评估并进而做出选择,为此,需要一个“测试集”来测试学习器对新样本的判别能力。然后以测试集上的“测…

cross-validation:从 holdout validation 到 k-fold validation

构建机器学习模型的一个重要环节是评价模型在新的数据集上的性能。模型过于简单时,容易发生欠拟合(high bias);模型过于复杂时,又容易发生过拟合(high variance)。为了达到一个合理的 bias-vari…

《The reusable holdout: Preserving validity in adaptive data analysis》中文翻译

写在前面:这是我看到的第一篇发在《science》上的文章,将近年来比较火的差分隐私用在解决过机器学习中的过拟合上,效果很棒。这是15年的文章,现在已经17年了,网上居然没有中文翻译,我就粗略的翻译一下给后来…

机器学习模型评测:holdout cross-validation k-fold cross-validation

cross-validation:从 holdout validation 到 k-fold validation 2016年01月15日 11:06:00 Inside_Zhang 阅读数:4445 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lanchunhui/article/details/5…

三种模型验证方法:holdout, K-fold, leave one out cross validation(LOOCV)

Cross Validation: A Beginner’s Guide An introduction to LOO, K-Fold, and Holdout model validation By: Caleb Neale, Demetri Workman, Abhinay Dommalapati 源自:https://towardsdatascience.com/cross-validation-a-beginners-guide-5b8ca04962cd 文章目录…

模型检验方法:holdout、k-fold、bootstrap

参考:https://www.cnblogs.com/chay/articles/10745417.html https://www.cnblogs.com/xiaosongshine/p/10557891.html 1.Holdout检验 Holdout 检验是最简单也是最直接的验证方法, 它将原始的样本集合随机划分成训练集和验证集两部分。 比方说&#x…

多种方式Map集合遍历

1.如何遍历Map中的key-value对,代码实现(至少2种) Map集合的遍历(方式1)键找值: package com.B.Container_13.Map;import java.util.HashMap; import java.util.Map; import java.util.Set;//Map集合的遍历(方式1)键找值 public class Map04_01 {publi…

Map集合中的四种遍历方式

1.Map接口的概述 &#xff08;1&#xff09;它是双列集合&#xff1b; &#xff08;2&#xff09;格式&#xff1a;Interface Map<k,v> K:键的类型 V&#xff1a;值得类型 &#xff08;3&#xff09;它的每个元素都包含一个键对象Key和值对象Value&#xff0c;并且他们…

Java中的Map集合以及Map集合遍历实例

文章目录 一、Map集合二、Map集合遍历实例 一、Map集合 Map<K,V>k是键&#xff0c;v是值 1、 将键映射到值的对象&#xff0c;一个映射不能包含重复的键&#xff0c;每个键最多只能映射的一个值 2、 实现类  a) HashMap  b) TreeMap 3、 Map集合和Collection集合的区别…

Map集合的四种遍历

Map集合的四种遍历 这里记录一下map集合的4种遍历&#xff1a; 第一种 得到所有的key–map.keySet() ,根据key拿到value–map.get(key) public static void main(String[] args) {Map<String, String> map new HashMap();map.put("1", "刘备");…

Map集合遍历的三种方式

Map集合遍历的三种方式 遍历Map集合的三种方式 键找值键值对Lambda表达式 方式一 : 键找值 先获取Map集合的全部键的Set集合遍历键的Set集合,然后通过键提取对应值 原理图 键找值涉及到的API 方法名称说明Set keySet()获取所有键的集合V get(Object key)根据键获取值 Map…

java中Map集合的四种遍历方式

java中Map集合的四种遍历方式 Map接口和Collection接口的集合不同,Map集合是双列的,Collection是单列的.Map集合将键映射到值的对象. 双列的集合遍历起来也是比较麻烦些的,特别是嵌套的map集合,这里说下MAP集合的四种遍历方式&#xff0c;并且以嵌套的hashMap集合为例, 遍历一…

如何遍历map集合

Map集合是基于java核心类——java.util中的&#xff1b; Map集合用于储存元素对&#xff0c;Map储存的是一对键值&#xff08;key和value&#xff09;&#xff0c;是通过key映射到它的value values() : 是获取集合中的所有的值----没有键&#xff0c;没有对应关系。 KeySet(…

Map集合常用的三种遍历方式

Map集合使用的是Key - Value的形式存储元素&#xff0c;也就是键值对的形式。Map集合内部的实现分别是HashMap和TreeMap&#xff0c;也就是哈希表和二叉树这两种数据结构。List集合和Set集合都是继承自Collection类&#xff0c;而Map集合就是自己的父类。前者可以直接通过Itera…

Map集合遍历方式

Map集合遍历方式一&#xff1a;键找值 先获取Map集合的全部键的Set集合 //Set keymap.keySet();遍历键的Set集合&#xff0c;然后通过键提取对应值map.getValue() Set<String> keysmaps.keySet();for(String key1:keys){int valu1emaps.get(key1);System.out.println(ke…

MAP集合的遍历方式

简单场景&#xff1a;map集合存放为数字星期 如图&#xff1a; 代码&#xff1a; Map<Integer, String> map new HashMap<>(); map.put(1, "星期一"); map.put(2, "星期二"); map.put(3, "星期三"); map.put(4, "星期四&quo…