【深度学习】:《PyTorch入门到项目实战》(十三)卷积神经网络:多通道输入和多通道输出

文章目录

  • 【深度学习】:《PyTorch入门到项目实战》(十三)卷积神经网络:多通道输入和多通道输出
  • 多通道输入和多通道输出
  • 前言
  • 1.多通道输入
  • 2.多通道输出
  • 3.代码实现
  • 3.1 多通道输入实现
  • 3.2 多通道输出实现

多通道输入和多通道输出

前言

我们之前已经介绍了单通道的卷积是如何进行填充padding、stride的。然而在实际分析中,我们的目标任务往往是多通道的。本文介绍一下如何进行多通道输入和多通道输出。

1.多通道输入

假如说我们不仅想检测灰度图像的特征,而是想要检测RGB彩色图像的特征。彩色图像如果是6×6×3,这里的3指的是三个颜色通道,可以把它想象成三个6×6图像的堆叠。为了检测图像的边缘或者其他的特征,不是把它跟原来的3×3的过滤器做卷积,而是跟一个三维的过滤器,它的维度是3×3×3,这样这个过滤器也有三层,对应红、绿、蓝三个通道。具体如下所示

卷积神经网络的通道数和vit中token数 多通道卷积神经网络_卷积核

注意:这个的输出会是一个4×4的图像,而不是不是4×4×3,。我们来分析一下这是如何计算的。首先,会拿这个3×3×3的卷积核先放到最左上角的位置,这个3×3×3的卷积核有27个数字,分别与原始图像对应的27个数字做内积。这样就得到了第一个数字,然后再根据相应的步长向右、向下移动。具体过程如下所示

卷积神经网络的通道数和vit中token数 多通道卷积神经网络_多通道_02

这样就将一个多输入通道的图像通过三维卷积核转换到了单输出通道图像。这意味着不论有多少输入通道,我们都只有一个输出通道。下面我们来看看如何进行多通道输出

2.多通道输出

在卷积神经网络中,有多个输出通道是至关重要的。在经典的神经网络架构中(例如LeNet,AlexNet,VGG等),随着神经网络层数的加深,我们常会增加输出通道的维数,通过减少空间分辨率以获得更大的通道深度。直观地说,我们可以将每个通道看作是对不同特征的反应。如下图所示:

卷积神经网络的通道数和vit中token数 多通道卷积神经网络_深度学习_03

我们让这个6×6×3的图像和两个3×3×3的过滤器卷积。第一个是黄色卷积核,假设是一个垂直边界检测器。第二个卷积核是橘色,假设是一个水平边界检测器。这样就得到4×4×2的输出。根据这个我们可以发现,假设卷积神经网络的通道数和vit中token数 多通道卷积神经网络_深度学习_04表示输入通道数,卷积神经网络的通道数和vit中token数 多通道卷积神经网络_卷积核_05表示输出通道数,则有n×n×卷积神经网络的通道数和vit中token数 多通道卷积神经网络_深度学习_04和一个卷积神经网络的通道数和vit中token数 多通道卷积神经网络_多通道_07的卷积核进行处理,得到一个卷积神经网络的通道数和vit中token数 多通道卷积神经网络_多通道_08的输出。

3.代码实现

3.1 多通道输入实现

# 导入相关库
import torch
from d2l import torch as d2l

def corr2d_multi_in(X, K):
    # 先遍历“X”和“K”的第0个维度(通道维度),再把它们加在一起。
    return sum(d2l.corr2d(x, k) for x, k in zip(X, K))

我们测试一下结果

X = torch.tensor([[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]],               [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]])
K = torch.tensor([[[0.0, 1.0], [2.0, 3.0]], [[1.0, 2.0], [3.0, 4.0]]])
X.shape,K.shape
(torch.Size([2, 3, 3]), torch.Size([2, 2, 2]))

可以看出,输入是一个2通道卷积神经网络的通道数和vit中token数 多通道卷积神经网络_深度学习_09的数据,卷积核是卷积神经网络的通道数和vit中token数 多通道卷积神经网络_卷积核_10,得到的结果为卷积神经网络的通道数和vit中token数 多通道卷积神经网络_多通道_11

corr2d_multi_in(X, K)
tensor([[ 56.,  72.],
        [104., 120.]])

3.2 多通道输出实现

定义多通道输出函数

def corr2d_multi_in_out(X, K):
    # 迭代“K”的第0个维度,每次都对输入“X”执行互相关运算。
    # 最后将所有结果都叠加在一起,注意,这里我们只对K进行遍历
    return torch.stack([corr2d_multi_in(X, k) for k in K], 0)

使用stack将卷积核堆叠

K = torch.stack((K, K + 1, K + 2), 0)
K.shape
torch.Size([3, 2, 2, 2])

可以看出这是一个3个输出通道,2个输入通道的2×2卷积核,因此得到的结果为卷积神经网络的通道数和vit中token数 多通道卷积神经网络_多通道_12

corr2d_multi_in_out(X, K)
tensor([[[ 56.,  72.],
         [104., 120.]],

        [[ 76., 100.],
         [148., 172.]],

        [[ 96., 128.],
         [192., 224.]]])