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

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

但是,

“它”是谁? “它”是怎样做到的?

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

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

下面,我们就开始吧!

上一节课,我们已经对输入图片做了“卷积”处理,将图片中所暗含的特征提取出来,未能听课的同学,可以查阅《吊炸天的CNNs,这是我见过最详尽的图解!(上)》

在提取特征的过程中,我们采用的是“过滤器中的数值,与原始图片中的相应数值,相乘、相加”的方法,例如:

事实上,在“卷积”过程中

上面这种对应数值相乘、再相加的计算,仅仅是“线性”计算;

而在现实世界中,很多很多的数据,都是“非线性”的。

所以,在“卷积”处理的后面,我们常常引入一个“非线性”的计算,来使得数据更加接近真实世界。

这个“非线性”计算,就是ReLU函数,它的图像形态犹如一条折线:

它就像是一个魔法袋子,所有经过它的数值:

如果是负数,出来的结果就是0 如果是正数或零,出来的结果仍是自己本身

ReLU计算,相当于把一条直线(“线性”)掰弯。

虽然,这种方法有点儿简单(……粗暴),但是,它能使我们最终的预测准确度得到提升。

具体到图片计算,ReLU相当于将“特征图片”中,像素值小于0的部分,全部变为0。

举个例子

假设经过“过滤器”提取后,得到的“特征图片”其像素值如左下图,那么,经过ReLU处理后,得到的“新的”特征图片会呈现右下图形态:

回到我们之前的例子中,在“卷积”的后面,再加上一步“ReLU计算”,即为:

因为我们之前使用的过滤器,其得到的数值,绝大多数均为正数,所以,经由ReLU处理后的图片,没有太大的改变,希望这并不影响你对于ReLU运算的理解。

当然,如果你的特征图片的尺寸很大的话,你还可以进一步添加“池化”的操作。

所谓“池化”,就是在保留图片主要信息的前提下,将图片的尺寸缩小。

池化的类型有很多种,诸如“最大池化”、“平均池化”、“求和池化”等等,它们的运算原理基本一致。

因为“最大池化”更为常用,所以我们重点介绍“最大池化”的运算过程。

假设经过ReLU处理后,我们得到的特征图片,如下图:

在对特征图片进行“池化”处理时,与“卷积”类似,需要我们设置2个超参数:

过滤器大小(F)滑动的步幅数(S)

这里,假设我们设置F=2,S=2,那么,“最大池化”为:

在每2*2(即4个)像素区域内,保留像素值最大的那一个,其余3个像素值抛弃。

如下图:

这样,经过“池化”处理,就将一个4*4大小的图片,缩小为2*2大小的图片了。

当然,在“池化”过程中,你也可以将超参数设置为F=3、S=2,只不过“F=2、S=2”更为常用。

回到我们之前的例子中,在“ReLU计算”的后面,再加上一步“最大池化”,即为:

(点击图片,查看大图)

故事至此,我们在第2个步骤中所涉及的所有环节,都已经学习完了。

回顾step2的整个流程:

输入图片 → 卷积 → ReLU → 池化(可选)

当然,你也可以不拘泥于此。有的时候,我们会进行多次卷积和池化,所以,更一般的形式:

举个例子:

★ 你可以构建2层“卷积 + ReLU”,如下:

输入图片 → 卷积 → ReLU → 卷积 → ReLU → 池化

★ 也可以构建2层“卷积 + ReLU + 池化”:

输入图片 → 卷积 → ReLU → 池化 → 卷积 → ReLU → 池化

当然,你还可以构建更多网络层,这里就不一一列举了。

温馨提示:

① “池化”层使用的过滤器,与“卷积”层使用的过滤器有所不同:

★ “池化”层的过滤器,其内部没有数值

因为“池化”层的过滤器,其功能只是将图片缩小,故其内部没有参数。

★ 在“池化”层中,仅有1个过滤器;而在“卷积”层中,可以设置多个过滤器

因为“卷积”层的过滤器,其功能是提取图片的特征,因而,我们使用不同的过滤器,可以提取不同的图片细节。

而“池化”层的过滤器,仅仅是为了缩小图片的尺寸,因而,使用一种过滤器,就可以达到这一目标,无需设置多个。

② 经过“卷积”处理后,得到的图片张数(即“图片深度”),应该等于该卷积层的过滤器个数;

而经过“池化”处理后,得到的图片张数(即“图片深度”),仍等于上一层的图片张数。

概念描述比较晦涩,直接看下图:

(点击图片,查看大图)

当仅有1个卷积层时,关于每一层的图片深度问题,尚且好理解(如上图所示)。

但是,当模型中含有多个卷积层,或者,输入的图片为彩色图片时,这个问题就容易被混淆,后面,我们在讲到彩色图片的图像处理时,仍会强调这个问题,此处,仅需记住这一概念就可以。

最后一步,该轮到我们的压轴大戏——“图片分类”了。

经过上面一系列的处理,此时得到的图片,已经可以被视为一串串简单的数字(即像素值)。

将这一个个的像素值,塞到我们初中就已接触过的表达式中:

x是谁?

还记得之前讲的计算机“眼中”的世界吗?

那一个格子、一个格子中的数字,就是x。

y是谁?

我们给每张图片打上的标签:这张图是“猫”、那张图是“狗”…… 统统这些标签,就是y。

θ是什么鬼?

当你给计算机很多组、很多组(x,y)时,它会自己去学习寻找x与y之间的关系,这个“关系”,就是θ。

当你拥有了θ,下一次,即使拿到一张没有打过标签的图片,你也可以通过已知的θ和x,知道y的取值,从而“知道图片里画的是什么?”。


所以,在“第3步 - 图片分类”中:

首先,需要把第2步得到的图片,其中的像素值“展开”。

为了方便大家理解,假设我们从第2步中,得到了2张2*2的图片,如果把它们的像素值“展开”,得到的效果为:

这样,我们就拿到了x。展开后所得到的

就是x。

在训练的最初,我们拥有每张图片的标签,即“我们已经拥有了y值”。

所以,在模型的最后,我们需要让计算机努力找到x-y之间的关系。

而寻找的办法,就需要依靠“全连接神经网络”:

所谓“全连接”,是指下一层的每一个神经元(即图中的“□”),与上一层的神经元全部相连,这里为了表达得更清晰,已经省去了中间的连接符。实际上,更多的时候,你会看到下面这样的图片:

不过,本文的重点不在于讲解“全连接神经网络”,如果你想了解更多相关的知识,可以关注微信公众号:AI传送门,来进行学习。

本文的核心在于卷积神经网络(CNNs)。

这里,你只需要记住2点:

① “全连接神经网络”可以帮助我们学习到参数θ。有了它,下一次再给计算机“看”图片时,计算机便会自动识别出图中的景象。

② 模型得到的最终结果,表示“图片为某种类别的概率”。注意:这里的概率之和,永远为1。

例如:

即计算机“判断”,最初输入的图片为“狗”。

我们将CNNs的所有流程,整合起来,即:

(点击图片,横屏查阅大图)

注意:手机和微信设置,均需开启横屏模式

恭喜你!

读到这里,卷积神经网络(CNNs)的所有环节,我们已经全部学习完了。

需要代码的同学,可以关注微信公众号:AI传送门,回复“CNNs代码”获得。

文章的最后,再来和大家讲一讲彩色图片的处理。

此部分内容属于延展阅读,学有余力的同学可以顺带了解下。

之前我们一直聊的是黑白图片(专业术语“灰度图”)的图像识别方法。

其实,彩色图片与灰度图类似,也是采用的如下流程:

唯一的区别在于:

在“第1步 - 读取图片”时,灰度图的深度仅为1,而彩色图的深度为3(彩色图片包含红R、绿G、蓝B,三种通道)

所以,彩色图片在进行第一层“卷积”时,需要同时处理3张图片(即“红、绿、蓝”)。

前面我们在处理灰白图片时,因为输入的图片其深度为1,所以我们采用的是大小为3*3,但是,深度为1的过滤器,例如:

而在处理彩色图片时,我们的过滤器,其深度增加为3,例如:

所以,如果我们在“卷积”层上,设置了2个过滤器,那么,它们的形态为:

以“第1个过滤器”为例,

当过滤器在图片上滑动时,

过滤器的“红色”层,负责提取原始图片“红色”通道的特征; 过滤器的“绿色”层,负责提取原始图片“绿色”通道的特征; 过滤器的“蓝色”层,负责提取原始图片“蓝色”通道的特征。

之后,将“红、绿、蓝”3层提取出的特征值相加,得到的最终值,就是“卷积”层输出的图片像素。

依然用例子来说明:

假设我们有一张宽、高、深为4*4*3的彩色图片。

并且,我们在“卷积层”,设置了2个过滤器,如下图:

(点击图片,查看大图)

那么,两个过滤器对彩色图片的特征提取方式为:

(点击图片,查看大图)

下面,让我们放慢动作,仔细看下,上述动图的运算过程:

当过滤器1滑过原始图片时,其运算步骤为:

step1: 过滤器先滑到原始图片“第一个3*3”的区域内。

step2: 过滤器与原始图片的对应元素“点乘”。(即对应元素相乘后、再相加)

step3: 将提取出的特征值:1,1,-2,三个数值相加。

step4: 相加后得到的结果“0”,此值即为“由第1个过滤器,提取出的第1个像素”。

重复3遍上述步骤,我们就能得到第1张完整的特征图片,这张图片是由过滤器1生成的,如下图:

同样的方法,我们可以使用“过滤器2”得到第2张特征图片:

而得到的两个结果:

就相当于下面的灰度图中,第1个“卷积”层得到的结果(见下图)。

只不过,在灰度图中,我们设置了4个过滤器,所以得到了4张“特征图”。

而在彩色案例中,我们仅设置了2个过滤器,所以,只得到了2张“特征图”。

(点击图片,横屏查阅大图)

而后面所有的流程,“ReLU → 池化 → 像素值展开 → 全连接 → 输出结果”,彩色图片的处理与灰度图一样,所以,具体的细节可以参考上面学过的内容。

温馨提示:

① 经过“卷积”后,输出的特征图片,其深度等于使用的过滤器个数

例如,

② 推广到更一般的情况,无论是灰度图片,还是彩色图片,当我们构建的模型中,有多个“卷积”层时,都要遵循“彩色案例”中的步骤,即“在做‘卷积’处理时,如果上一层图片是多层,那么,本层过滤器在遍历完多层图片后,需要将结果值相加“。

总结

用图片可以更形象的表述

人类:

计算机:

在构建模型时,需要我们设置的超参数有:

★ 卷积层: 过滤器的大小(F)、滑动的步幅数(S),以及过滤器的个数(K)

如果你期望输出的图片,与输入的图片尺寸一致,你还可以在原始图片的外围补零,补零的圈数P=(F-1)/2

★ 池化层:过滤器的大小(F)

在算法运行时,计算机会自己学习的参数有:

★ 卷积层: 过滤器中的具体数值。

★ 全连接层: 神经元的参数 θ

当计算机算出最优参数后,下一次,在输入一张没有打过标签的图片时,算法就能自动对图片做出分类。

结束语

卷积神经网络(CNNs)能够提取图像的核心特征,并使用这些特征,来识别包含类似特征的图像,在“自动驾驶”、“人类识别”、“医疗图像诊断”等方面,都发挥着极大的作用。

CNNs非常强大,或许在本文中,为了尽可能将算法可视化,所做的一些简化处理并不完美,但是,仍然希望本文能够帮助到更多正在学习CNNs原理的同学们。

原文发布于微信公众号 - AI传送门(aiportal)

原文发表时间:2017-08-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

20120918-向量实现《数据结构与算法分析》

#include <iostream> #include <list> #include <string> #include <vector> #include...

1706
来自专栏java闲聊

JDK1.8 ArrayList 源码解析

当运行 ArrayList<Integer> list = new ArrayList<>() ; ,因为它没有指定初始容量,所以它调用的是它的无参构造

1192
来自专栏ml

朴素贝叶斯分类器(离散型)算法实现(一)

1. 贝叶斯定理:        (1)   P(A^B) = P(A|B)P(B) = P(B|A)P(A)   由(1)得    P(A|B) = P(B|...

3427
来自专栏alexqdjay

HashMap 多线程下死循环分析及JDK8修复

1K4
来自专栏计算机视觉与深度学习基础

Leetcode 114 Flatten Binary Tree to Linked List

Given a binary tree, flatten it to a linked list in-place. For example, Given...

1938
来自专栏拭心的安卓进阶之路

Java 集合深入理解(6):AbstractList

今天心情比天蓝,来学学 AbstractList 吧! ? 什么是 AbstractList ? AbstractList 继承自 AbstractCollec...

19110
来自专栏开发与安全

算法:AOV网(Activity on Vextex Network)与拓扑排序

在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称之为AOV网(Activity on Vextex ...

2517
来自专栏拭心的安卓进阶之路

Java 集合深入理解(12):古老的 Vector

今天刮台风,躲屋里看看 Vector ! 都说 Vector 是线程安全的 ArrayList,今天来根据源码看看是不是这么相...

2437
来自专栏项勇

笔记68 | 切换fragmengt的replace和add方法笔记

1444
来自专栏后端之路

LinkedList源码解读

List中除了ArrayList我们最常用的就是LinkedList了。 LInkedList与ArrayList的最大区别在于元素的插入效率和随机访问效率 ...

19410

扫码关注云+社区