动手学深度学习--卷积神经网络

发布时间 2023-10-14 15:35:57作者: 次林梦叶

image

from pixiv


从全连接层到卷积

现在我们给自己一个任务:用神经网络去识别区分出百万级像素的不同图片

回顾一下以前:我们是通过多层感知机来实现的,当面对一张图片的时候,我们将其看成一个像素点矩阵,然后将其从二维拉直到一维上,再通过MLP进行训练

但是我们这次的任务每张照片具有百万级像素,这意味着网络的每次输入都有一百万个维度。 即使将隐藏层维度降低到1000,这个全连接层也将有 1e6×1e3=1e9个参数。 想要训练这个模型将不可实现,因为需要有大量的GPU、分布式优化训练的经验和超乎常人的耐心。

或许我们是时候需要进行改变了



识别一张图片我们真的需要看全部的像素吗?(不用,局部性)
识别一张图片我们训练的模型对于取图片不同位置(不同像素点矩阵)处就不适用了吗?(不,平移不变性)

image


我们下面尝试用公式表示上述性质:

image

image

来自评论区的一条好评论:w_{i,j,k,l}中,i,j代表输出的点在输出矩阵中的位置,k,l代表输入点在输入的图(或者矩阵)中的位置。那么这个权重矩阵应该记录输入中的每一个点对于输出中的每一个点的影响(也就是权重)。举例来说,比如输入图是4x4的,输出图是2x2的。我需要记录输入图中(1,1), (1,2), ..., (2,1), ..., (4,4)这些所有的点对输出图(1,1)的影响,同理也需要记录这些所有点对输出图中(1,2), ...., (2,2)的影响。那么这时候对于每一组点就有4个参数:输入图的横坐标、纵坐标,输出图的横坐标、纵坐标。所以要想完全记录所有的权重,需要一个4维张量。


将上述两条性质结合起来的形象产物就是卷积核:

理解卷积核的好视频

image

f(z)与 g(x-z)中的两个参数z与x-z是否相加为x是判断是否是卷积的一个关键
在深度学习中f(z)可以看成源值,g(x-z)可以看成是对源值的权重影响,积分型号可以变成求和符合
z可以看成我们的起始点,x可以看成我们的目标点
一个f(z)g(x-z)可以表示为起始点的源值f(z)对目标点的影响大小是g(x-z),所以影响值是:f(z)g(x-z)


进一步到二维情况:

image

这里起始点为(x-1,y-1),目标点是(x,y)
那么g函数的参数是(x-(x-1),y-(y-1))=(1,1)
然后通过我们的卷积核可以知道对应的g(1,1)的值

image

卷积核工作过程图