专门被用在图像上的架构。

Image Classification

假设图片的大小都是一样的。

就算是今天实际处理也是先 rescale 一下,然后再处理。

一张图片是一个三维的 tensor。

高和宽和 channels。

然后把它 flatten 成一个向量。

由于数据非常的庞大,所以如果使用 Fully Connected Network,会有大量的参数(图片的长 * 宽 * 3),所以会增加 overfitting 的风险。

两个简化方案:

  1. 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>

  2. Parameter Sharing

    由于可能存在 Neuron 处理相同的特征,所以为了避免做重复的工作,引入了这个简化概念。

    <aside> 💡 可以将这里和下面的用同样的 filter 去扫描理解,“扫描”是理解这个问题的关键。 这里可以引申 CNN 的使用场景:“同样的东西出现在不同的位置”。

    </aside>

    Weight(parameter) 是一样的。就算 parameter 是一样的,但是输入的 Receptive field 不同,则输出结果也是不同的。

    常见共享方法:

    每个 Receptive field 对应的 Neuron 共享参数。

满足 1 和 2 的就被称为 Convolutional Layer

Screen Shot 2022-04-17 at 8.08.32 PM.png

虽然 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>

整个过程:

Screen Shot 2022-04-17 at 8.41.56 PM.png

用在语音和文字和文字上设计时使用的 Receptive field 和 Parameter Sharing 是不一样的。

有一些坑

将原始图片放大缩小、旋转都是不行的。所以你得整个预处理。

有可以处理的:Spatial Transformer Layer。