JoyBeanRobber

导航

李沐动手学深度学习12——卷积神经网络基础

卷积神经网络是一类强大的、为处理图像数据而设计的神经网络。

对卷积神经网络的学习包括卷积层本身填充和步幅的基本细节用于在相邻区域汇聚信息的汇聚层在每一层中多通道的使用,以及有关现代卷积网络架构的仔细讨论

1.卷积的意义

假设,我们想从一张图片中找到某个物体,那么无论以哪种方法找到这个物体,都应该与物体的位置无关。我们可以用设置一个检测器,检测器把图片分割成多个区域,并在每个区域为包含该物体的可能性打分。

将上述想法归纳为两点:1.平移不变性:不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应、

           2.局部性:神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系

2.卷积的简单实现

# 二维互相关运算(CNN卷积运算)
def corr2d(X, K):
    # K为卷积核,X为输入张量
    h, w = K.shape
    # Y为输出张量
    Y = torch.zeros((X.shape[0]-h+1, X.shape[1]-w+1))
    for i in range(Y.shape[0]):
        for j in range(Y.shape[1]):
            # 逐元素相乘
            Y[i, j] = (X[i:i+h, j:j+w] * K).sum()
    return Y


# 卷积层类
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

 

3.填充和步幅

填充:有时在应用多层卷积时,会丢失边缘元素,单个卷积过程可能只损失几个像素,但随着应用许多连续卷积层时,丢失的像素就多了。所以使用填充来解决这个问题,在输入图像的边界填充元素(一般为0)。

   若无填充,输入i*j形状向量,卷积核为w*h形状向量,输出形状为(i-w+1)*(j-h+1)。若添加k行/列填充,输出形状也会增加k行/列,所以有时设置添加w-1行、h-1列,使输入和输出形状相同。

   因此,通常将卷积核的行列长设置为奇数,使得行列上的填充行数为偶数,可以在顶/底部、左/右侧分配相同的行/列数。

步幅:进行互相关计算即卷积层计算时,卷积窗口从输入张量的左上角开始,向下、向右滑动。在上面的例子中默认每次滑动一个元素,但有为了高效计算或是缩减采样次数,卷积窗口可以跳过中间位置,每次滑动多个元素。我们将每次滑动元素的数量称为步幅

 

4.多通道

多通道图像:例如彩色的RGB图像,顾名思义,有red、green、blue三层,所以当图像为RGB格式图像时,输入张量形状为3*h*w,我们将这个大小为3的轴称为通道维度。

多输入通道:当输入包含多个通道时,卷积核也需要具有相同通道数(增加一个输入通道数维度,现在卷积核形状为 i*k*w),

      此时由于输入和卷积核通道相同,可以对每个通道输入的二维张量和卷积核的二维张量进行互相关运算,再对通道求和。代码如下:

def corr2d_multi_in(X, K):
    # 遍历第0个维度,再求和
    return sum(corr2d(x, k) for x, k in zip(X, K))

多输出通道:为了获得多个通道的输出,为每一个输出通道创建一个形状为 i*k*w 的卷积核张量(i为输入通道数,k、w为卷积核行列数),这样一来,卷积核形状为o*i*k*w(o为输出通道数)。代码如下:

def corr2d_multi_in_out(X, K):
    # 遍历K的第0个维度,与X进行互相关运算,最后在第0维度上叠加
    return torch.stack([corr2d_multi_in(X, k) for k in K], 0)

1*1卷积层:即卷积核的h、w为1,1*1卷积层无法提取相邻像素的相关特征,其意义在于:通过调整1*1卷积层的输入、输出通道数维度,来调整通道数量。

 

5.汇聚层

和卷积层类似,汇聚层运算符由一个固定形状的窗口组成,该窗口根据其步幅大小在输入的所有区域上滑动,为固定形状窗口(有时称为汇聚窗口)遍历的每个位置计算一个输出。

但汇聚层不包含参数,通常计算汇聚窗口中所有元素的最大值或平均值,这些操作分别称为最大汇聚层和平均汇聚层。

汇聚层的意义在于:1.压缩空间尺寸,2.降低对特征位置与局部形变的敏感性,3.扩大后续卷积层的感受野

汇聚层的填充与步幅:同卷积层

汇聚层的多通道:汇聚层在每个通道上单独运算,不会在通道上对输入进行汇总,所以汇聚层的输入与输出通道数相同

 

6.经典模型LeNet

卷积层——汇聚层——卷积层——汇聚层——全连接层——全连接层——全连接层

    net = nn.Sequential(
        nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(),
        nn.AvgPool2d(kernel_size=2, stride=2),
        nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),
        nn.AvgPool2d(kernel_size=2, stride=2),
        nn.Flatten(),
        nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),
        nn.Linear(120, 84), nn.Sigmoid(),
        nn.Linear(84, 10))

 

posted on 2025-05-11 18:26  欢乐豆掠夺者  阅读(23)  评论(0)    收藏  举报