百科知识

想知道两个函数卷积怎么算吗看这里就对了

全卷积网络(fully convolutional network,FCN)是一种基于卷积神经网络的技术,它能够实现从图像的每个像素点直接到像素类别的映射[36]。与传统的卷积神经网络相比,全卷积网络引入了转置卷积(transposed convolution)这一关键组件。通过转置卷积层,网络能够将中间层特征图的空间维度(即高度和宽度)恢复到输入图像的尺寸,确保预测结果与原始图像在空间上保持一一对应关系:即图像中任意位置的像素都可以通过对应通道维的输出得到其类别预测。

在进行实验之前,我们需要导入相关的包或模块,并首先理解转置卷积层的工作原理。

现在,我们从矩阵乘法的角度来重新描述卷积运算。假设输入向量为x,权重矩阵为W,那么卷积的前向计算函数可以被视为将函数的输入与权重矩阵相乘,从而得到一个向量输出

。根据链式法则,我们知道反向传播的计算需要依赖于这个前向计算函数。由于

,卷积的反向传播函数可以看作是将函数的输入与转置后的权重矩阵

相乘。转置卷积层恰好实现了这一功能:它交换了卷积层的前向计算函数和反向传播函数,使得这两个函数分别对应于将函数的输入向量与

和W相乘。

转置卷积层的主要作用是改变卷积层输入和输出的形状。让我们继续用矩阵乘法来描述卷积。假设权重矩阵的形状为

,对于一个长度为16的输入向量,卷积的前向计算将输出一个长度为4的向量。如果输入向量的长度为4,那么转置权重矩阵的形状将变为

,此时转置卷积层将输出一个长度为16的向量。在模型设计中,转置卷积层通常用于将较小的特征图放大为更大的特征图。在全卷积网络中,当输入的特征图具有较小的空间维度时,转置卷积层能够有效地将特征图的高度和宽度放大到与输入图像相同的尺寸。

让我们通过一个具体的例子来进一步说明。首先,我们构造一个卷积层conv,并设定输入X的形状为 (1,3,64,64)。经过卷积层处理后,输出的通道数增加到10,但高度和宽度分别缩小了一半。

接下来,我们通过创建Conv2DTranspose实例来构建转置卷积层conv_trans。在这个例子中,我们保持conv_trans的卷积核形状、填充以及步幅与conv中的设置相同,并将输出通道数设置为3。当输入为卷积层conv的输出Y时,转置卷积层的输出将与卷积层输入的高度和宽度保持一致:转置卷积层将特征图的高度和宽度分别放大了2倍。

在某些文献中,转置卷积也被称为分数步长卷积(fractionally-strided convolution)[12]。

下面,我们将详细介绍全卷积网络的基本设计。如图9-11所示,全卷积网络首先利用卷积神经网络来提取图像特征,然后通过一个1 × 1卷积层将通道数调整为类别数量,最后通过转置卷积层将特征图的高度和宽度调整回输入图像的尺寸。这样,模型的输出将与输入图像的高度和宽度完全一致,并且在空间位置上保持一一对应关系:输出的每个通道都包含了对应空间位置像素的类别预测。

图9-11 全卷积网络的结构示意图

为了实现这一设计,我们使用一个基于ImageNet数据集预训练的ResNet-18模型来提取图像特征,并将该模型实例命名为pretrained_net。通过观察该模型的成员变量,我们可以看到其features部分包含了最后两层分别是全局最大池化层GlobalAvgPool2D和样本变平层Flatten,而output模块则包含了用于输出预测的全连接层。在全卷积网络的设计中,我们不需要使用这些层。

接下来,我们创建全卷积网络的实例net。这个实例将复制pretrained_net实例中除了最后两层之外的所有层,并继承预训练得到的模型参数。

假设输入图像的高度和宽度分别为320和480,经过net的前向计算后,这些维度将减小到原来的1/32,即高度和宽度分别变为10和15。

接下来,我们通过一个1 × 1卷积层将输出通道数调整为Pascal VOC2012数据集的类别数量21。最后,我们需要将特征图的高度和宽度放大32倍,以恢复到输入图像的原始尺寸。回忆一下5.2节中描述的卷积层输出形状的计算方法。由于

,我们构造一个步幅为 32 的转置卷积层,并将卷积核的高度和宽度设置为 64、填充设置为 16。通过简单的计算可以发现,如果步幅为、填充为/2(假设/2为整数)、卷积核的高度和宽度为2,转置卷积层将输入的高度和宽度分别放大倍。

转置卷积层的主要功能是放大特征图。在图像处理中,我们有时需要将图像放大,这一过程被称为上采样(upsample)。上采样的方法有多种,其中一种常用的方法是双线性插值。简单来说,为了得到输出图像在坐标

上的像素值,我们首先将该坐标映射到输入图像的对应坐标

,例如,可以根据输入与输出的尺寸比例来进行映射。映射后的

通常是实数。然后,在输入图像上找到与坐标

最近的4个像素。最后,输出图像在坐标

上的像素值将根据输入图像上这4个像素及其与

的相对距离进行计算。双线性插值的上采样可以通过一个由以下bilinear_kernel函数构造的卷积核的转置卷积层来实现。由于篇幅限制,我们仅提供bilinear_kernel函数的实现代码,而不深入讨论其算法原理。

现在,我们通过实验来验证使用转置卷积层实现的双线性插值上采样效果。我们构造一个能够将输入的高度和宽度放大2倍的转置卷积层,并使用bilinear_kernel函数来初始化其卷积核。

读取图像X,并将上采样后的结果存储为Y。为了打印图像,我们需要调整通道维的位置。

通过观察结果,我们可以看到转置卷积层成功地将图像的高度和宽度分别放大了2倍。值得注意的是,除了坐标刻度的差异外,双线性插值放大的图像与9.3节中打印出的原始图像看起来非常相似。

在全卷积网络中,我们将转置卷积层初始化为双线性插值的上采样操作。对于1 × 1卷积层,我们采用Xavier随机初始化方法。

我们使用9.9节介绍的方法来读取数据集。在这里,我们指定随机裁剪的输出图像的形状为320 × 480:高度和宽度都可以被 32 整除。

现在,我们可以开始训练模型了。这里的损失函数和准确率计算与图像分类任务中的方法并没有本质上的区别。由于我们使用转置卷积层的通道来预测每个像素的类别,因此在SoftmaxCrossEntropyLoss中指定了axis=1(通道维)选项。此外,模型的准确率计算基于每个像素的预测类别是否正确。

在预测阶段,我们需要对输入图像的各个通道进行标准化处理,并将其转换为卷积神经网络所需的四维输入格式。

为了可视化每个像素的预测类别,我们将预测类别映射回它们在数据集中的原始标注颜色。

测试数据集中的图像在大小和形状上各不相同。由于模型使用了步幅为32的转置卷积层,当输入图像的高度或宽度无法被32整除时,转置卷积层的输出可能会与输入图像的尺寸不完全匹配。为了解决这个问题,我们可以在图像中截取多个高度和宽度为32的整数倍的矩形区域,并对这些区域中的像素分别进行前向计算。这些区域的并集需要完整覆盖输入图像。当一个像素被多个区域覆盖时,它在不同区域前向计算中转置卷积层输出的平均值可以作为softmax运算的输入,从而得到最终的类别预测。

为了简化实验,我们仅读取几张较大的测试图像,并从图像的左上角开始截取形状为 320 × 480的区域:只有该区域用于预测。对于输入图像,我们先打印截取的区域,然后打印预测结果,最后打印标注的类别(另见彩插图20)。

小结

卷积运算可以通过矩阵乘法来实现。

全卷积网络首先利用卷积神经网络提取图像特征,然后通过1 × 1卷积层将通道数调整为类别数量,最后通过转置卷积层将特征图的高度和宽度调整回输入图像的尺寸,从而实现对每个像素的类别预测。

在全卷积网络中,转置卷积层可以被初始化为双线性插值的上采样操作。

本书旨在为读者提供关于深度学习的交互式学习体验。书中不仅详细阐述了深度学习的算法原理,还展示了它们的实现和运行效果。与传统图书不同,本书的每一节都是一个可以下载并运行的Jupyter记事本,它将文字、公式、图像、代码和运行结果有机地结合在一起。此外,读者还可以访问并参与书中内容的讨论。全书的内容分为三个部分:第一部分介绍深度学习的背景知识,提供必要的预备知识,并包括深度学习的基础概念和技术;第二部分描述深度学习计算的重要组成部分,并解释近年来在多个领域取得巨大成功的卷积神经网络和循环神经网络;第三部分探讨优化算法,分析影响深度学习计算性能的关键因素,并分别介绍深度学习在计算机视觉和自然语言处理中的重要应用。本书同时涵盖了深度学习的方法和实践,主要面向在校大学生、技术人员和研究人员。阅读本书需要读者具备基本的Python编程能力或掌握附录中描述的线性代数、微分和概率基础。