0%

卷积神经网络理论基础

卷积

互相关运算:

卷积核的每一位与待卷积矩阵对应位相乘后求和

0 x 0+1 x 1+3 x 2+4 x 3=19,其他类似

卷积核向右移动一位后,0 * 1 + 2 * 1 + 4 * 2 + 5 * 3 = 25

卷积核到下一行:0 * 3 + 1 * 4 + 6 * 2 + 7 * 3 = 37

再向右移动一位:0 * 4 + 1 * 5 + 7 * 2 + 8 * 3 = 43

卷积层

卷积层对输入和卷积核权重进行互相关运算,并在添加标量偏置之后产生输出。所以卷积层中的两个被训练的参数是卷积核权重和标量偏置

机初始化卷积核权重。

手搓实现

1
2
3
4
5
6
7
8
class Conv2D(nn.Module):
def __init__(self, kernel_size):
super().__init__()
self.weight = nn.Parameter(torch.rand(kernel_size))
self.bias = nn.Parameter(torch.zeros(1))

def forward(self, x):
return corr2d(x, self.weight) + self.bias

导包实现

1
2
from torch import nn
conv1 = nn.Conv2d(in_channel = , out_channel = , kernel_size = )

一般首先关心的就是输入的通道数,输出的通道数,卷积核大小,初始化权重什么的不用操心

特征映射和感受野

上图输出的卷积层有时被称为特征映射(feature map),因为它可以被视为一个输入映射到下一层的空间维度的转换器,

卷积神经网络中,对于某一层的任意元素x,其感受野(receptive field)是指在前向传播期间可能影响x计算的所有元素(来自所有先前层)。如上图,给定2×2卷积核,阴影输出元素值19的感受野是输入阴影部分的四个元素

感受野可能大于输入的实际大小。(这个很好理解,因为来自前面所有层,二输入仅仅指的是输出的前一层)

卷积中的填充:

减少边缘像素的丢失

卷积中的步幅

多输入多输出

多输入

输入包含多个通道时,需要构造一个与输入数据具有相同输入通道数的卷积核,以便与输入数据进行互相关运算

先是各自通道上卷积核与各自通道进行互相关运算,然后将得到的两个输入求和成一个数作为对应位置的输出

多输出

随着神经网络层数的加深,我们常会增加输出通道的维数,通过减少空间分辨率以获得更大的通道深度。

汇聚

处理图像时,我们希望逐渐降低隐藏表示的空间分辨率、聚集信息,这样随着我们在神经网络中层叠的上升,每个神经元对其敏感的感受野(输入)就越大。

通过逐渐聚合信息,生成越来越粗糙的映射,最终实现学习全局表示的目标,同时将卷积图层的所有优势保留在中间层。

目的

降低卷积层对位置的敏感性

同时降低对空间降采样表示的敏感性。

种类

最大汇聚层

每次取核里面最大的作为对应位置的输出

平均汇聚层

每次对核里面的求和取平均作为对应位置的输出

多个通道

汇聚层在每个输入通道上单独运算,而不是像卷积层一样在通道上对输入进行汇总。 这意味着汇聚层的输出通道数与输入通道数相同。

调整大小计算宽和高

参数计算主要是在从最后的卷积层或者池化层后,进行映射的全连接层的第一层前,需要展平成一维张量,这时就要通过参数计算来确定目前输出通道数,全部相乘的结果作为全连接层的第一层的输入通道数

1
2
3
4
卷积后宽和高常用计算公式:
(图像尺寸-卷积核尺寸 + 2*填充值)/步长+1
池化后宽和高常用计算公式:
(图像尺寸-池化窗尺寸 + 2*填充值)/步长+1

参考文章

不成文规定

池化参数一般就是(2, 2)

中间的channel数量都是自己设定的,二的次方就行

kernelsize一般3或者5之类的