[DAY 12] CNN 简介

前言


总算开始了一个跟DL比较有关系的名词啦(?)一直以来科学家总想模仿动物的大脑来做AI结构,所以或多或少你们会看过科学家研究猫的脑部来知道大脑的哪个部分是做甚麽的,像下面这张图,以期能够设计出一套厉害的AI系统
https://ithelp.ithome.com.tw/upload/images/20190922/20120549WctlsoszEY.png
CNN做为DL崛起有着不可抹灭的功劳,像是拿到与纽约大学教授勒昆(Yann LeCun)和蒙特娄大学教授班吉欧(Yoshua Bengio)一起共同拿到 2019 图灵奖的多伦多大学电脑科学教授辛顿(Geoffrey Hinton)在 2012 的 ImageNet 竞赛提出的 AlexNet 以惊人的优势赢了比赛。
https://ithelp.ithome.com.tw/upload/images/20190922/20120549Mu7aly2oSf.png
我们可以看到2012提出的 AlexNet相对於之前非 CNN-based 方法有了个非常大的进步,而之後提出的方法也是CNN-based 的,并且到了 2014 的 GoogleNet 电脑视觉的辨识能力就已经跟人类差不多了,而 ILSVRC 的classification比赛在2017年也是最後一届,因为之後提出来的model的辨识能力已经远远超过人类的,这也说明了 CNN 的powerful !!

CNN


由於 CNN 的内容众多并且也是各类型的 model (VAE、GAN)的基础或者子结构,因此我们会花比较多的篇幅来说一下,主要会分成以下几点来说明:
1.简介与背景
2.结构简介
3.Convolution、Pooling等等算法
4.Backward 更新
5.实做以及实例演练

结构简介

首先先举一个简单的CNN例子给大家看看,如下图
https://ithelp.ithome.com.tw/upload/images/20190922/20120549wtiqSF2a2E.png
这是一个简单的 CNN 使用例子,使用一个CNN做照片分类,我们可以看到这个CNN Model的 Input 是一张照片,中间一堆方格的意思表示着 CNN 的结构,最後输出的是是个机率值,代表着这个model认为这张照片对这些类别的机率值,图片中觉得这张照片最有可能是 "boat" 这个类别,因为他的机率最高(0.94)。
而这张图片也充分提示了我们一个基本的 CNN model 会有的结构会有以下几个:
1.Convolution Layer
2.Pooling Layer
3.Activation Function (图片中红字 "Relu" 的部分)
4.Fully Connected Layer
当然在CNN结构中其实也不只这一些小结构,也可以再加上像是 Batch Normaliztion 等等结构,但对於初不接触我们先专心讨论核心的结构就好,以下提点各种 Layer 的目的以及大概长啥样:

Convolution Layer

不罗嗦先上张图介绍 Convolution 在算的时候长啥样
convolution
如果大家看不到上面这张这可以看下面这一张XD
Imgur
Convolution Layer 主要是用来从前一层的output中汲取 feature 或者资讯成为新的一张 feature map
那我们先从 Convolution layer 中的名子 convolution 介绍起

Convolution 计算

首先在 Convolution layer我们要提到我们最重要的计算模式 -- Convolution 计算 ,但这麽快直接跳进去我们大概会出事,所以我们先提一下几个设定:
1.为求简单,我们先设定我们的 Input 图片为一张一个 channal 的2D 图片,例如是一张灰阶照片,而像是彩色RGB照片为 3 个 Channal 这样。这张照片只有 5 * 5 大小,每个像素值只有0或1 (当然正常的灰阶照片值域在0~255)
https://ithelp.ithome.com.tw/upload/images/20190923/201205498ykfFhEwhZ.png
2.我们有一个filter(或者也称为 kernal),大小为 3 * 3,是用来与input进行 convolution 计算,得到我们的 feature map
https://ithelp.ithome.com.tw/upload/images/20190923/20120549TPcsgaFwBJ.png
3. Feature map 为我们这个 convolution 计算的结果,上面内涵着我们从Input萃取出来的资讯
https://ithelp.ithome.com.tw/upload/images/20190923/20120549aU8fk0DkQS.png
4. Convolution 计算规则如下:
依照定义,连续的2D convolution 计算规则如下:
https://ithelp.ithome.com.tw/upload/images/20190923/20120549htpoQ6lAvZ.png
但我们今天是2D的一格一格进行convolution计算,因此是属於离散的,所以也别慌,公式会像下面这样:
https://ithelp.ithome.com.tw/upload/images/20190923/20120549tPQA0dg0ii.png
5. 在进行 Convolution 计算时,细心的你或许会发现,诶~我算完了这3 * 3 格Input与kernal的convolution之後,那下一轮要从哪里开始算呢?是移动一格,还是移动整整三格不要重复算到已经算到的部分在开始算,这是可以介绍一个概念叫做 "Stride" 意思就是步幅,就是你这 Kernal 每次跟 Input 上的 3 * 3 算完之後往旁边移动的像素数,当然我们可以直觉发现如果Stride越大,那Kernal跟Image做完整个 convolution 的次数越少,所产生的feature map越小,举个例子齁:
https://ithelp.ithome.com.tw/upload/images/20190923/20120549pKNtUyVEU5.png
6. 诶诶,上面那张图怎麽多了一个新名词 "Padding" ,这又是啥QQQQ 细心的你或许想过,我们的 kernal 今天算到边边时,以 5 * 5 image 为例子,你的kernal中间已经移动到Image边号为5的位置,阿这个不是不能算吗?我们Image又没有第6格可以给 kernal 做 convolution ,那怎麽办QQQ旁边补0或者啥的呀XDD "Padding" 就是定义在整个 Image外面我们要做甚麽处里,常见的有 Zero-Padding(如下图),注意input最外圈填0的部分就是 padding加上去的,当然也有改成填1的paading方法:
https://ithelp.ithome.com.tw/upload/images/20190923/20120549cDEr07Sdfk.png
7. 结合上面的几个的动图整个convolution可以参考下面动图:
convolution
如果大家看不到上面这张这可以看下面这一张XD
Imgur

Pooling Layer

Pooling Layer 也被称为 Downsampling 、 Spatial Pooling)或 Subsampling,主要是可以缩小、浓缩 Feature map,但同时希望能够保留 Feature map 内的关键讯息,即用来降低采样数,可以控制所存着并丢到下一层的资讯不会越来越多,但又不会流失重要资讯效果就像是这个下面连结一样:
Pooling效果参考
把一张照片撷取些小照片资讯拼起来,画面变小但还是看得出来是啥
Pooling主要的效果有:

  1. 增加感受野,因为照片变小了,所以如果kernal在上面移动做计算,花更少的步数就可以看完整张照片
  2. Translation Invariance:因为pooling对照片进行压缩,所以已经抽象化并压缩了一部分的资讯,像是 maxpooling 是取一定空间方格内的最大值,所以只要这个方格一起移动,那麽其实取 pooling 後的结果一样会保留最大值的那格因此允许照片中的物体做一定量的移动
  3. 减小矩阵大小可以减少记忆体使用量以及减少了计算参数可以避免 Overfitting
  4. 常见的 Pooling有以下两种 : Max 以及 Average,那麽顾名思义的效果也可见下面
    https://ithelp.ithome.com.tw/upload/images/20190924/20120549HSvHTadJqc.png
    5.如果有多张Feature Map,那Pooling是分别对每张 Feature Map 做!!

Activation Layer

在每层 convolution layer 之後,让output的值经过一个 non-linear 转换,可以让我们的 Model 去拟合更复杂、非线性的资料,常见的有像是 Relu、sigmoid等等
https://ithelp.ithome.com.tw/upload/images/20190922/20120549dvEeDwHXL9.png
那在最开始的时候,科学家们参考了生物学界的神经在传递资讯给下一个神经元时会有全有全无律,意即如果不超过一定量值时,是不会传递资讯下去的
https://ithelp.ithome.com.tw/upload/images/20190924/20120549W53cgf91l6.png
在类神经网路中使用Activation Function(激励函数),主要是利用非线性方程序,解决非线性的问题,若不使用激励函数,类神经网路即是以线性的方式组合运算(意即多个矩阵相乘还是只是个矩阵),而Activation Function其实可以随意设计但有以下两个限制:

  1. 激励函数需选择可微分之函数,因为在误差反向传递(Back Propagation)运算时,需要进行一次微分计算。
    2.在深度学习中,当隐藏层之层数过多时,激励函数不可随意选择,因为会造成梯度消失(Vanishing Gradient)以及梯度爆炸(Exploding gradients)等问题。这两个问题我们会在 "Backpropagation"那章提及
    常见的 Activation Function 有以下几个:
    https://ithelp.ithome.com.tw/upload/images/20190924/20120549Xr5rHmENoZ.png

Fully Connected Layer

最後我们来提一下 fully connected layer,顾名思义他会与前一层的每个 unit做连结计算,因此所需要的记忆体通常不小,而convolution layer也是提出用来更有效、使用较少的变数达到一样的计算拟合能力的 tool。
https://ithelp.ithome.com.tw/upload/images/20190922/20120549vGGFv3toly.png
在整个 CNN model 中,如果说前面的 Convolution layer 是为了把 Feature 从Input Image中取出来,那麽通俗来说,Fully connected layer就是为了把萃取来的Feature 对映(Mapping) 到样本Label的空间(Space)中做Classification,其本质上来说就是一个矩阵向量乘积:
https://chart.googleapis.com/chart?cht=tx&chl=Y%20%3D%20Wx
那行是大概如下:
https://ithelp.ithome.com.tw/upload/images/20190925/20120549IXrUJjgcpN.png
OK,我们知道了 Fully Connected 是一个转换矩阵去试着 Mapping feature Map 到 Label space,但这是可能会有个问题QQ那麽就是经过 Convolution 计算之後不是一个Feature map 长得是矩阵那种方形的吗?怎麽就变成一条长的可以跟 Fully Connected做全连接了?????
这边要介绍一个工具叫做 Flatten:

Flatten

https://ithelp.ithome.com.tw/upload/images/20190925/201205493NHzjqpj2X.png
假设我们有5个3 * 3的Feature map,然後我们需要用让他变成4096维然後跟Fully Connected layer 做连结,那麽其实Flatten此时就是 3x3x5x4096 的 convolution layer 去跟 feature map 做 convolution计算得出来,太绕口了吗?那麽只需要记做下面这张图就好:
https://ithelp.ithome.com.tw/upload/images/20190925/20120549NAl0xLVxi1.png

Loss Function

我们的 Model 总算测出来一个甚麽鬼了XD逾时我们可以去找别人开始吹我们的 Model有多猛,但我们需要一个量化的值去说明我们的 Model 有多好,或者换句话说,我们预测出来的值能跟 Ground Truth 有多像。所以这边我们知道了第一个 Loss Fuction的重点也是最重要的一个重点 :
Loss Fuction 必须要能够足够有效地说明你的 Prediction 跟 Ground Truth有多像
所以其实 Loss Function 某种程度上也代表了我们希望我们的 Model 的 Goal,或者说我们想要缩小的、最小化的目标函式是甚麽(Objective Function)
那麽常见的用来做Classification的 Loss function就是交叉熵(cross-entropy)
https://ithelp.ithome.com.tw/upload/images/20190925/20120549VcnrvL8eMO.png

结语


作为 DL 的入门结构, CNN 的设计我们需要好好的去掌握,知道每个部分的计算以及用意,对於之後在建构较为复杂的Model 我们就能够更大胆的把CNN的这个子结构当零件组上去!!有了这些工具,其实我们已经有能力可以构建出一个 CNN 模型,但这个虽然能动,却还不具备学习的能力,因此下一章我们将介绍 CNN 进步的动力: Backpropagation !
加油!这是开始的一小步,但却是坚定的一小步

参考资料

  1. https://adeshpande3.github.io/adeshpande3.github.io/A-Beginner's-Guide-To-Understanding-Convolutional-Neural-Networks/
  2. https://blog.csdn.net/u012905422/article/details/52463324
  3. https://darren1231.pixnet.net/blog/post/336760136-convolutional-neural-net-%E7%AD%86%E8%A8%98
  4. https://zhuanlan.zhihu.com/p/23185164
  5. https://medium.com/jameslearningnote/%E8%B3%87%E6%96%99%E5%88%86%E6%9E%90-%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-%E7%AC%AC5-1%E8%AC%9B-%E5%8D%B7%E7%A9%8D%E7%A5%9E%E7%B6%93%E7%B6%B2%E7%B5%A1%E4%BB%8B%E7%B4%B9-convolutional-neural-network-4f8249d65d4f
  6. https://brohrer.mcknote.com/zh-Hant/how_machine_learning_works/how_convolutional_neural_networks_work.html
  7. http://yangguang2009.github.io/2016/12/18/deeplearning/convolutional-neural-networks-for-machine-learning/
  8. https://medium.com/@chih.sheng.huang821/%E5%8D%B7%E7%A9%8D%E7%A5%9E%E7%B6%93%E7%B6%B2%E8%B7%AF-convolutional-neural-network-cnn-%E5%8D%B7%E7%A9%8D%E9%81%8B%E7%AE%97-%E6%B1%A0%E5%8C%96%E9%81%8B%E7%AE%97-856330c2b703
  9. http://mengqi92.github.io/2015/10/06/convolution/
  10. https://blog.csdn.net/danieljianfeng/article/details/42433475
  11. https://www.zhihu.com/question/36686900
  12. https://www.quora.com/What-is-the-benefit-of-using-average-pooling-rather-than-max-pooling
  13. https://blog.csdn.net/u012193416/article/details/79432668
  14. https://medium.com/@bdhuma/which-pooling-method-is-better-maxpooling-vs-minpooling-vs-average-pooling-95fb03f45a9
  15. https://zhuanlan.zhihu.com/p/32299939
  16. **https://blog.csdn.net/danieljianfeng/article/details/42433475**
  17. https://zhuanlan.zhihu.com/p/42741086
  18. https://morvanzhou.github.io/tutorials/machine-learning/ML-intro/3-04-activation-function/
  19. https://towardsdatascience.com/activation-functions-and-its-types-which-is-better-a9a5310cc8f
  20. https://medium.com/jameslearningnote/%E8%B3%87%E6%96%99%E5%88%86%E6%9E%90-%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-%E7%AC%AC5-1%E8%AC%9B-%E5%8D%B7%E7%A9%8D%E7%A5%9E%E7%B6%93%E7%B6%B2%E7%B5%A1%E4%BB%8B%E7%B4%B9-convolutional-neural-network-4f8249d65d4f
  21. https://blog.csdn.net/qq_39521554/article/details/81385159
  22. https://zhuanlan.zhihu.com/p/33841176
  23. https://ithelp.ithome.com.tw/articles/10187521
  24. https://towardsdatascience.com/convolutional-neural-network-17fb77e76c05
  25. https://medium.com/@chih.sheng.huang821/%E6%A9%9F%E5%99%A8-%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92-%E5%9F%BA%E7%A4%8E%E4%BB%8B%E7%B4%B9-%E6%90%8D%E5%A4%B1%E5%87%BD%E6%95%B8-loss-function-2dcac5ebb6cb

<<:  媒体分析为公司带来的5项好处及4个常见使用情境

>>:  D27 - 如何用 Apps Script 自动化地创造与客制 Google Sheet?(四)蒐集大量试算表中的回应

ASP.NET MVC 从入门到放弃(Day20) -MVC模型(Model) Entity Framework

接下来讲讲Entity Framework 如何建立... 首先先开启visual studio.....

30 天 React 学习之路 (Day1)

React 的网路资源很多,这个系列只忠实纪录 30 天阅读 React 官方文件, 消化吸後的所知...

RDS Deadlock

有Transaction就有可能会发生Deadlock. 在RDS上发生的时候就可从LOG里看出发生...

Day 06 : 什麽是 MLOps

各种商务情境都在思考如何融入 AI 提供更适切的智慧化服务,在Day 04 : 以资料为中心的人工智...

Day20 测试写起乃 - $CHILD_STATUS

这其实与测试无关是我最近看得很新奇的东西就来额外补充一下XD 在 rb file 里如果用反引号 可...