听课(李宏毅老师的)笔记,方便梳理框架,以作复习之用。本节课主要讲了CNN的适用范围,整体架构与工作流程,CNN的应用,CNN的缺点以及解决方法。
1. CNN的输入与输出
CNN是专门为了图像而设计的一种网络架构
1.1 输出
CNN的输出是一个向量,每一个元素都代表了属于该类的得分。举例来说,在训练时,通过使下图的两个向量的交叉熵最小,达到最佳的训练效果。
1.2 输入
一张100*100的彩色图片将分为三个channel,代表RGB,将三个tensor拉长,组成了右边的很长的列向量
2. 在图像识别时是否真的需要全连接网络?
一个图像经常是几百几千的像素,而且还是三个channel, 那么这么长的向量输入进去,如果每一个都要跟不同的权重参数相乘,比如我们有1000个神经元,那么我们需要1001003*1000个权重参数。虽然这样模型的弹性将会非常大,但是容易造成overfitting,况且计算时间也会很久
3. observation 1:识别关键部分
我们在设置神经元的时候,不用让一个神经元看整张图片,而是看最关键的部分。
具体怎么看关键的部分呢?我们先引入一个概念——receptive field。将这个333的立方体拉长展开成右侧的这个长向量,输入进神经元。
常见的设置如下:
- kernel size:333(但是一般将深度省略)
- stride:2 步长为2,表示每次向右或者向下移动receptive field两格
- 可以重叠
- 不够了可以用0补全
- 每个receptive field通常配置64个神经元监视
一直移动直到这个立方体的右下角,那么receptive fields将会覆盖整张图片。
4. observation 2:相同的关键部分出现在不同的区域
4.1 从神经元角度讲述
如果因为receptive field不一样,监测receptive field的相同的pattern的神经元不一样,那么参数量也太大了。
所以我们提出了一种方法——parameter sharing
就是指receptive field不一样,但权重参数却一样。但是一个receptive field的两个神经元不会共享参数。
这里的神经元我们有一个专门的名字来称呼——filter
4.2 小结
4.3 从filter角度讲述
这步就是要看哪个receptive field跟filter更接近(就是更像关键部位),越接近分越高
第一个filter做完之后按照同样的方法做filter2,形成了两层,我们称之为feature map
4.4 两种角度的对比
5. observation 3: 子采样不会改变图片
由于有时图片数据量过于庞大,可以考虑采用子采样,不会太影响图片,又减少了计算量。
5.1 池化的具体过程(以max pooling为例)
通常情况下是2次conv1次pooling,或者1次conv1次pooling
5.2 小结
6. CNN应用
6.1 AlphaGo
为什么AlphaGo能用CNN做呢?
其实我们可以把一个小棋局看成是一个pattern,而这个pattern可能出现在棋盘的任意位置
pooling对于CNN来说并不是绝对要用的,我们要明确pooling的本质是子采样用以减少计算量,但是如果计算量不大就没必要采用pooling,采用了说不定还不准确,所以AlphaGo就完全没用pooling
6.2 speech and NLP
7. CNN的缺点
如果给CNN训练时的图是上面这个小狗,但是让他去识别下面这个小狗,可能不一定识别成功,因为CNN是无法处理放大缩小旋转的。
但是这还是有解决方法的——Data Augmentation. 在训练的时候,就对训练集中的数据进行放大缩小旋转,丰富我们的数据集