再认识 CNN,emmm 这是一个错误的周报,暂时存档。

Basic

对于一个全连接层,我们会将图像 flatten 成一个向量,然后乘上相应的参数,得到一个输出。

引入 CNN 的目的是为了解决 FC overfitting,如后文所说,主要是改为了 local connectivity。

Screen Shot 2022-06-01 at 12.08.10 PM.png

Filter

对于 CNN,为了提取图片中部分特征,我们保留图片的原始结构。在上面应用 filter,做 element-wise product。在实际计算的时候会将这两个向量 flatten,然后做 dot product。

注意到 filter 的参数是有 bias 的,如 👉

Screen Shot 2022-06-01 at 1.32.10 PM.png

经过一个 filter 滑过所有的区域后,形成的矩阵称为 activation map,这个矩阵的 channel 为 1。

Screen Shot 2022-06-01 at 1.45.48 PM.png

我们可以给图像应用多个 filter,捕捉不同的 features,从而形成一张“新的图片”,它包含多个 channels。

Screen Shot 2022-06-01 at 1.48.22 PM.png

对于有 batch 的版本。

Screen Shot 2022-06-02 at 10.21.45 AM.png

如果直接将 conv 层接在一块,由于他们是一个线性运算,所以直接堆叠和使用一个没什么区别,使用激活函数来解决这个问题。

添加 active func

添加 active func


每一个 filter 都在寻找某种共同特征,比如图像的边缘。

此卷积非彼卷积。

值得注意的是,卷积神经网络里的卷积和信号处理处理的是不一样的,函数没有发生翻转。

这个对应的操作应该叫做 correlation。

展示了不同 filter 对于不同特特的提取

展示了不同 filter 对于不同特特的提取


如果图片相当大的话,为了看到图片中的一个区域,则需要叠加多层 conv,为了解决这个问题,引入 stride。

在滑动的过程中,我们可以设置不同的 stride,可以获得不同 output size,通常我们需要保证 output size 是一个整数。

使用不同的 stride,得到不同的 output size。

使用不同的 stride,得到不同的 output size。

如何 “感知” 到更大的区域?

如何 “感知” 到更大的区域?

使用更大的 stride 时,意味着其可以“更快的”感受到原始图片上更大的区域。 这里的“更快的”,指只需少量的 conv 层。


有时,我们希望能保持原来图像大小输出,可以增加 padding 来解决这个问题。

例如如右图所见,对于一个 7 x 7 大小的图片,当我们不使用 padding 时,应用 3 x 3 的 filter + 1 stide,可以得到 5 x 5 的输出;当我们使用 padding 时,可以得到一个 7 x 7 的输出。

Screen Shot 2022-06-01 at 2.34.13 PM.png


有关一些常用参数的设定。

Screen Shot 2022-06-02 at 12.55.03 PM.png

1 x 1 的 filter 也是很常用的,可以用在减少 channels 上。

Screen Shot 2022-06-01 at 2.54.14 PM.png

当然还有一些别的类型的 convolution。

比如 1D 和 3D 的。

Screen Shot 2022-06-02 at 1.05.25 PM.png

Screen Shot 2022-06-02 at 1.04.45 PM.png