图解CNN

引入CNN

开始,对CNNs真的是费解,直到看了诸多大神的博客再加上斯坦福大学Andrew 的Deep Learning课程,顿时感到觉得心中豁然开朗,现在将其整理如下,方便日后自己遗忘时候

用一个简单的例子,理解卷积神经网络(CNN)做的事情--------确定一幅图像是包含有"X"还是"O"?
在这里插入图片描述
所以,每次给你一张图,你需要判断它是否含有"X"或者"O",并且假设必须两者选其一,所以结果,不是"X"就是"O",

在这里插入图片描述
对于计算机来说,只要图像稍稍有一点变化,不是标准的,解决这个问题就会变得不那么容易:
在这里插入图片描述
计算机要解决上面这个问题,一个比较天真的做法就是先保存一张"X"和"O"的标准图像,然后将其他的新给出的图像来和这两张标准图像进行对比,看看到底和哪一张图更匹配,就判断为哪个字母。

但是这么做的话,其实是非常不可靠的,因为计算机还是比较死板的。在计算机的“视觉”中,一幅图看起来就像是一个二维的像素数组(可以想象成一个棋盘),每一个位置对应一个数字。在我们这个例子当中,像素值"1"代表白色,像素值"-1"代表黑色。
在这里插入图片描述
当比较两幅图的时候,如果有任何一个像素值不匹配,那么这两幅图就不匹配,至少对于计算机来说是这样的。

对于这个例子,计算机认为上述两幅图中的白色像素除了中间的3*3的小方格里面是相同的,其他四个角上都不同:

在这里插入图片描述
因此,从表面上看,计算机判别右边那幅图不是"X",两幅图不同:
在这里插入图片描述
但是这么做,显得太不合理了。理想的情况下,我们希望,对于那些仅仅只是做了一些像平移,缩放,旋转,微变形等简单变换的图像,计算机仍然能够识别出图中的"X"和"O"。

就像下面这些情况,我们希望计算机依然能够很快并且很准的识别出来:
在这里插入图片描述
这也就是CNN出现所要解决的问题。

特征提取(feature extraction)

在这里插入图片描述
对于CNN来说,它是一块一块地来进行比对。它拿来比对的这个“小块”我们称之为Features(特征)。

在两幅图中大致相同的位置找到一些粗糙的特征进行匹配,CNN能够更好的看到两幅图的相似性,相比起传统的整幅图逐一比对的方法,每一个feature就像是一个小图(就是一个比较小的有值的二维数组)。

不同的Feature匹配图像中不同的特征。在字母"X"的例子中,那些由对角线和交叉线组成的features基本上能够识别出大多数"X"所具有的重要特征。
在这里插入图片描述
这些features很有可能就是匹配任何含有字母"X"的图中字母X的四个角和它的中心。那么具体到底是怎么匹配的呢?如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
看到这里是不是有了一点头目呢。但其实这只是第一步,你知道了这些Features是怎么在原图上面进行匹配的。

但是你还不知道在这里面究竟进行的是怎样的数学计算,比如这个下面3*3的小块到底干了什么?

在这里插入图片描述
接下来就跟进介绍里面的数学操作,也就是我们常说的“卷积”操作。

卷积(Converlution)

当给你一张新的图时,CNN并不能准确地知道这些features到底要匹配原图的哪些部分,所以它会在原图中每一个可能的位置进行尝试。这样在原始整幅图上每一个位置进行匹配计算,我们相当于把这个feature变成了一个过滤器。这个我们用来匹配的过程就被称为卷积操作,这也就是卷积神经网络名字的由来。

二维卷积示例:

对一个 6 × 6 6×6 6×6的图像进行卷积运算,卷积运算用 ∗ * 来表示,用 3 × 3 3×3 3×3的过滤器对其进行卷积,这个卷积运算的输出将会是一个4×4的矩阵,你可以将它看成一个4×4的图像。下面来说明是如何计算得到这个4×4矩阵的:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如此重复进行元素乘法,然后加起来。通过这样做得到-10。再将其右移得到-2,接着是2,3。以此类推,这样计算完矩阵中的其他元素。
在这里插入图片描述

三维卷积示例:

1. 一个过滤器(One filter)

现在,假如说你不仅想检测灰度图像的特征,也想检测RGB彩色图像的特征。彩色图像如果是6×6×3,这里的3指的是三个颜色通道,你可以把它想象成三个6×6图像的堆叠。为了检测图像的边缘或者其他的特征,不是把它跟原来的3×3的过滤器做卷积,而是跟一个三维的过滤器,它的维度是3×3×3,这样这个过滤器也有三层,对应红绿、蓝三个通道。

这里的第一个6代表图像高度,第二个6代表宽度,这个3代表通道的数目。

同样你的过滤器也有一个高,宽和通道数,并且图像的通道数必须和过滤器的通道数匹配,所以这两个数(紫色方框标记的两个数)必须相等。

在这里插入图片描述
现在,卷积操作的过程如下图所示:在这里插入图片描述
最后,输出会是一个4×4×1的图像,注意是4×4×1,最后一个数不是3了。
在这里插入图片描述

2. 两个过滤器(Two filters)

如下图,和第一个过滤器卷积,可以得到第一个4×4×1的输出,然后卷积第二个过滤器,得到一个不同的4×4×1的输出。
所以,把这两个输出堆叠在一起,这样你就都得到了一个4×4×2的输出立方体
在这里插入图片描述

3. 小结

我们总结一下维度,如果你有一个 n × n × n c n\times n\times n_c n×n×nc(通道数)的输入图像,在这个例子中就是6×6×3,这里的 n c n_c nc 就是通道数目,然后卷积上一个 f × f × n c f\times f\times n_c f×f×nc,这个例子中是3×3×3,按照惯例,这个(前一个 n c n_c nc)和这个(后一个 n c n_c nc)必须数值相同。然后你就得到了 ( n − f + 1 ) × ( n − f + 1 ) × n c ′ (n-f+1)\times (n-f+1)\times n_c' (nf+1)×(nf+1)×nc,这里 n c ′ n_c' nc 其实就是下一层的通道数,它就是你用的过滤器的个数,在我们的例子中,那就是4×4×2。我写下这个假设时,用的步幅为1,并且没有padding。如果你用了不同的步幅或者padding,那么这个数值会变化。

注意理解这句话,输出的通道数会等于你要检测的特征数!

例1.

比如,输入是一个 32 × 32 × 3 32×32×3 32×32×3 的图像,3表示RGB三通道,每个filter/kernel是 5 × 5 × 3 5×5×3 5×5×3 ,一个卷积核产生一个feature map,下图中,有6个 5 × 5 × 3 5×5×3 5×5×3 的卷积核,故输出6个feature map(activation map),大小即为 28 × 28 × 6 28×28×6 28×28×6
在这里插入图片描述
下图中,第二层到第三层,其中每个卷积核大小为 5 × 5 × 6 5×5×6 5×5×6,这里的6就是 28 × 28 × 6 28×28×6 28×28×6 中的 6 6 6,两者需要相同,即每个卷积核的“层数”需要与输入的“层数”一致。有几个卷积核,就输出几个feature map,下图中,与第二层作卷积的卷积核有 10 10 10个,故输出的第三层有 10 10 10个通道。
在这里插入图片描述

例2.

N × N N×N N×N大小的输入(暂时不考虑通道数),与 F × F F×F F×F大小的卷积核(暂时不考虑个数)做卷积,那么输出大小为多大?

计算公式为: ( N − F ) / s t r i d e + 1 (N - F) / stride + 1 (NF)/stride+1,其中stride为做卷积是相邻卷积核的距离。
在这里插入图片描述

例3.

当输入为 7 × 7 7×7 7×7大小,卷积核为 3 × 3 3×3 3×3 s t r i d e = 1 stride=1 stride=1,在 7 × 7 7×7 7×7周围补上一圈 0 0 0(pad=1个像素),那么输出大小为多大?

7 × 7 7×7 7×7
在这里插入图片描述

例4.

输入为 32 × 32 × 3 32×32×3 32×32×3,卷积核大小为 5 × 5 5×5 5×5,总共有 10 10 10个卷积核,做卷积的时候 s t r i d e = 1 , p a d = 2 , stride=1,pad=2, stride=1pad=2那么这一层总共含有多少参数?

每个卷积核含有的参数个数为: 5 × 5 × 3 + 1 = 76 5×5×3 + 1 = 76 5×5×3+1=76,其中1是偏置bias,由于有 10 个 10个 10卷积核,故总参数为 76 × 10 = 760 76×10=760 76×10=760
在这里插入图片描述

参考

1.Andrew Ng的深度学习课程,和斯坦福Cs231的课程
2.https://www.jianshu.com/p/fe428f0b32c1理解CNN的图大多来自于此!
3.https://blog.csdn.net/v_JULY_v/article/details/51812459理解CNN:卷积神经网络

池化(pooling)

CNN中使用的另一个有效的工具被称为“池化(Pooling)”。池化可以将一幅大的图像缩小,同时又保留其中的重要信息。池化背后的数学顶多也就是小学二年级水平。它就是将输入图像进行缩小,减少像素信息,只保留重要信息。通常情况下,池化都是22大小,比如对于max-pooling来说,就是取输入图像中22大小的块中的最大值,作为结果的像素值,相当于将原始图像缩小了4倍。(注:同理,对于average-pooling来说,就是取2*2大小块的平均值作为结果的像素值。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值