文章目录
- 卷积操作
- 池化
- Padding
- 对多通道(channels)图片的卷积
- 套上激活函数是什么样的
- 参考:
卷积层是深度学习神经网络中经常使用的一种层。它通过卷积运算来提取输入的特征,常用于图像、语音等信号处理任务中。
卷积层有以下几个参数:
- 卷积核:卷积层中包含若干个卷积核,每个卷积核都是一个二维权重矩阵。卷积核的大小通常是奇数,比如3x3、5x5等,以便于有一个中心点,可以更好地提取特征。
- 步长(stride):指卷积核在输入数据上移动的步长。比如,构建一个3x3的卷积核,步长为2,表示每次卷积操作都会跨越2个像素。
- 边界填充(padding):指在输入数据的四周填充一圈像素,以保持卷积之后图像的大小与输入数据相同。这样可以避免卷积操作后特征图的大小缩小太快,丢失重要信息。
- 激活函数:卷积层后面通常会接一个激活函数,用来引入非线性因素,从而增强网络能力。
这样说有些抽象,上例子
卷积操作
好的,我们可以通过一个简单的例子来说明卷积操作的过程:
阴影部分是第一个输出元素以及用于输出计算的输入和核张量元素: 0 × 0 + 0 × 1 + 0 × 2 + 0 × 3 = 0 0×0+0×1+0×2+0×3=0 0×0+0×1+0×2+0×3=0。
池化
这个pooling,是为了提取一定区域的主要特征,并减少参数数量,防止模型过拟合。 比如下面的MaxPooling,采用了一个2×2的窗口,并取stride=2:
除了MaxPooling,还有AveragePooling,顾名思义就是取那个区域的平均值。
Padding
上面的卷积操作有啥问题
- 每次卷积,图像都缩小,这样卷不了几次就没了; 原图像在经过filter卷积之后,变小了,从(8,8)变成了(6,6)。假设我们再卷一次,那大小就变成了(4,4)了。
- 相比于图片中间的点,图片边缘的点在卷积中被计算的次数很少。这样的话,边缘的信息就易于丢失。
为了解决这个问题,我们可以采用padding的方法。我们每次卷积前,先给图片周围都补一圈空白,让卷积之后图片跟原来一样大,同时,原来的边缘也被计算了更多次。
对多通道(channels)图片的卷积
彩色图像,一般都是RGB三个通道(channel)的,因此输入数据的维度一般有三个:(长,宽,通道)。 比如一个28×28的RGB图片,维度就是(28,28,3)。
前面的引子中,输入图片是2维的(8,8),filter是(3,3),输出也是2维的(6,6)。
如果输入图片是三维的呢(即增多了一个channels),比如是(8,8,3),这个时候,我们的filter的维度就要变成(3,3,3)了,它的 最后一维要跟输入的channel维度一致。 这个时候的卷积,是三个channel的所有元素对应相乘后求和,也就是之前是9个乘积的和,现在是27个乘积的和。因此,输出的维度并不会变化。还是(6,6)。
但是,一般情况下,我们会 使用多了filters同时卷积,比如,如果我们同时使用4个filter的话,那么 输出的维度则会变为(6,6,4)。
从知乎拿的图,来展示上面的过程:
图中的输入图像是(8,8,3),filter有4个,大小均为(3,3,3),得到的输出为(6,6,4)。 我觉得这个图已经画的很清晰了,而且给出了3和4这个两个关键数字是怎么来的
套上激活函数是什么样的
其实,如果套用我们前面学过的神经网络的符号来看待CNN的话,
- 我们的输入图片就是X,shape=(8,8,3);
- 4个filters其实就是第一层神经网络的参数W1,,shape=(3,3,3,4),这个4是指有4个filters;
- 我们的输出,就是Z1,shape=(6,6,4);
- 后面其实还应该有一个激活函数,比如relu,经过激活后,Z1变为A1,shape=(6,6,4);
所以,在前面的图中,我加一个激活函数,给对应的部分标上符号,就是这样的:
参考:
【DL笔记6】从此明白了卷积神经网络(CNN) - 知乎 (zhihu.com)
6.3. 填充和步幅 — 动手学深度学习 2.0.0 documentation (d2l.ai)