专门被用在图像上的架构。
Image Classification
假设图片的大小都是一样的。
就算是今天实际处理也是先 rescale 一下,然后再处理。
一张图片是一个三维的 tensor。
高和宽和 channels。
然后把它 flatten 成一个向量。
由于数据非常的庞大,所以如果使用 Fully Connected Network,会有大量的参数(图片的长 * 宽 * 3),所以会增加 overfitting 的风险。
两个简化方案:
pattern
我们观察到可以去识别图像中一些特定的特征。需要的是那些特别关键的 pattern。
定义 Receptive field,Neuron 使用其作为输入,而不是整个图片。
还记得 HW2 中的 Concatenate the neighboring 么,这里的 Receptive field 也可以重叠。还可以将同一个范围用多个 Neuron。
最经典的设计:
all channels, kernel size (e.g. 3 × 3), each receptive field has a set of neurons (e.g., 64 neurons), stride(horizontal, vertical) = 2, padding(0)
<aside> 💡 padding 是边缘补全。 CNN 的适用场景:“一小片区域的信息提取”。
</aside>
Parameter Sharing
由于可能存在 Neuron 处理相同的特征,所以为了避免做重复的工作,引入了这个简化概念。
<aside> 💡 可以将这里和下面的用同样的 filter 去扫描理解,“扫描”是理解这个问题的关键。 这里可以引申 CNN 的使用场景:“同样的东西出现在不同的位置”。
</aside>
Weight(parameter) 是一样的。就算 parameter 是一样的,但是输入的 Receptive field 不同,则输出结果也是不同的。
常见共享方法:
每个 Receptive field 对应的 Neuron 共享参数。
满足 1 和 2 的就被称为 Convolutional Layer
虽然 bias 大,但是非常适合做图像识别
另一种解释
先来一组 filter(Receptive field 对应的 parameter 矩阵),去图片里面抓 pattern。
然后用一个 filter 去和图片所有的区域(按照 stride 的大小) 做 inner product。然后会生成一组值,这组值可以组成一个矩阵。
<aside> 💡 注意到这里的所有区域,实际上是和前面的 Parameter Sharing 对应的,也就是对不同的区域应用相同的参数。 而每一个 filter 对应的实际上是每一个 Neuron 所计算出的 parameter 矩阵。 使用一个 filter “扫过” 整个图片的过程称为 Convolutional。
</aside>
随后用剩下的 filter 做同样的事,最后会形成一个新的 “图片”,其 channel 对应的个数等于刚才所使用的 filter 个数。
以上为第一层。
当叠加层数(卷的次数)增加的时候,所能“看到”的范围更大了。
关于 Pooling
有点像是一个 Active Function,是一个 Operator
简单介绍一下 Max Pooling
为 filter 的结果分组,然后为每一组选一个最大的(Max)。
<aside> 💡 如果是 Mean Pooling 就是平均。
</aside>
将 Pooling 穿插在网络层中间。
近来也有将 Pooling 去掉的,因为算力增加了。这个主要是解决算力问题的。
<aside> 💡 设计 pooling 是存在原因的,当你觉得 pooling 没用,甚至起反作用时,可以将其去掉。
</aside>
整个过程:
用在语音和文字和文字上设计时使用的 Receptive field 和 Parameter Sharing 是不一样的。
有一些坑
将原始图片放大缩小、旋转都是不行的。所以你得整个预处理。
有可以处理的:Spatial Transformer Layer。