欢迎光临散文网 会员登陆 & 注册

21 卷积层里的多输入多输出通道【动手学深度学习v2】

2023-07-20 20:24 作者:月芜SA  | 我要投稿

多输入通道:

多通道用于提取图片内的不同特征信息,是比较重要的超参数

对于不同的通道,使用不同的卷积核进行处理


c:channel,通道数

卷积核数等于输入通道数,输出通道为1

多输出通道:使用多个三维卷积核


多通道卷积输入和输出的意义:

不同的输出通道可以识别特定的图形模式(比如不同的颜色、不同方向的纹理等)


特殊卷积核:1*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))

zip(X, K)函数可以将X和K的每个通道配对,返回一个可迭代对象,其中每个元素是一个(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]]])

corr2d_multi_in(X, K)


tensor([[ 56.,  72.],
        [104., 120.]])


计算多个通道输出的互相关函数(互相关运算即为卷积运算)

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

通过将核张量KK+1K中每个元素加1)和K+2连接起来,构造了一个具有3个输出通道的卷积核。

K = torch.stack((K, K + 1, K + 2), 0)
K.shape


torch.Size([3, 2, 2, 2])

下面,我们对输入张量X与卷积核张量K执行互相关运算。现在的输出包含3个通道,第一个通道的结果与先前输入张量X和多输入单输出通道的结果一致。

corr2d_multi_in_out(X, K)


tensor([[[ 56.,  72.],
         [104., 120.]],

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

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


1*1卷积核的情况

下面,我们使用全连接层实现1×1

卷积。 请注意,我们需要对输入和输出的数据形状进行调整。

def corr2d_multi_in_out_1x1(X, K):
    c_i, h, w = X.shape
    c_o = K.shape[0]
    X = X.reshape((c_i, h * w))
    K = K.reshape((c_o, c_i))
    # 全连接层中的矩阵乘法
    Y = torch.matmul(K, X)
    return Y.reshape((c_o, h, w))


当执行1×1

卷积运算时,上述函数相当于先前实现的互相关函数corr2d_multi_in_out。让我们用一些样本数据来验证这一点。


X = torch.normal(0, 1, (3, 3, 3))
K = torch.normal(0, 1, (2, 3, 1, 1))

Y1 = corr2d_multi_in_out_1x1(X, K)
Y2 = corr2d_multi_in_out(X, K)
assert float(torch.abs(Y1 - Y2).sum()) < 1e-6


Pytorch简洁调用版


知识补充:

padding 0过多不会影响模型性能

21 卷积层里的多输入多输出通道【动手学深度学习v2】的评论 (共 条)

分享到微博请遵守国家法律