2.3.多输入多输出通道

多输入多输出通道

彩色图像具有标准的RGB通道来代表红、绿和蓝。 但是到目前为止,我们仅展示了单个输入和单个输出通道的简化例子。 这使得我们可以将输入、卷积核和输出看作二维张量。

当我们添加通道时,我们的输入和隐藏的表示都变成了三维张量。例如,每个RGB输入图像具有3×ℎ×𝑤的形状。我们将这个大小为3的轴称为通道(channel)维度。

1.多输入通道

​ 当拥有多个输入通道时,每个通道都有一个卷积核,结果是所有通道卷积结果的和,假设有两个输入通道

在这里插入图片描述

2.多输出通道

​ 目前为止我们只用到过单输出通道,对于多输出通道,我们可以有多个三维卷积核(多出来的一维用于选择时做哪个输入通道的卷积),每个核生成一个输出通道:

​ 核变成四维的了,通过 ( c o , c i ) (c_o,c_i) (co,ci)确定是哪个输出通道的哪一个输入通道的卷积和,通过 c o c_o co来确定是哪个输出通道的卷积后的矩阵。

意义

​ 每个输出通道可以识别特定模式(特征图的意思?),

在这里插入图片描述

​ 输入通道核识别组合输入中的模式。假设上述6个输出通道的输出又输入到下一个层,则可以对这六个特征进行权重组合。

3. 1×1卷积层

k h = k w = 1 k_h =k_w =1 kh=kw=1的卷积核不识别空间模式,只是融合通道

在这里插入图片描述

​ 使用1×1卷积核与3个输入通道和2个输出通道的互相关计算。 这里输入和输出具有相同的高度和宽度,输出中的每个元素都是从输入图像中同一位置的元素的线性组合。 我们可以将1×1卷积层看作在每个像素位置应用的全连接层,以 c i c_i ci个输入值转换为 c o c_o co个输出值。 因为这仍然是一个卷积层,所以跨像素的权重是一致的。 同时,1×1卷积层需要的权重维度为 c o c_o co× c i c_i ci,再额外加上一个偏置。

​ 等价于输入形状为 n h n w × c i n_hn_w\times c_i nhnw×ci,权重为 c o × c i c_o\times c_i co×ci的全连接层

二维卷积层

在这里插入图片描述

  • 输出通道时卷积层的超参数,输入不是,输入是上一层的超参数
  • 每个输入通道有独立的二维卷积核,所有通道结果相加得到一个输出通道结果
  • 每个输出通道有独立的三维卷积核

代码实现

import torch
from d2l import torch as d2l


def corr2d_multi_in(X, K):  # X和K都是多输入的,zip后,将其按第一个维度进行组合
    # 先遍历“X”和“K”的第0个维度(通道维度),再把它们加在一起
    return sum(d2l.corr2d(x, k) for x, k in zip(X, K))  # corr2d可以参考convolution.py中,就是二维互相关计算


# 两个输入通道,两个二维卷积核
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]]])

print(corr2d_multi_in(X, K))


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


'''torch.stack()
函数的意义:使用stack可以保留两个信息:[1. 序列] 和 [2. 张量矩阵] 信息,属于【扩张再拼接】的函数。
形象的理解:假如数据都是二维矩阵(平面),它可以把这些一个个平面按第三维(例如:时间序列)压成一个三维的立方体,而立方体的长度就是时间序列长度。该函数常出现在自然语言处理(NLP)和图像卷积神经网络(CV)中。'''

K = torch.stack((K, K + 1, K + 2), 0)
print(K.shape)  # K本来是一个2*2*2的矩阵,通过stack将3个这样的矩阵拼接,形成了四维的矩阵

# 3个输出通道,每个通道输出一个2*2的矩阵
print(corr2d_multi_in_out(X, K))

'''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)) # 卷积核的形状应该是 c_o × (h*w)
    # 全连接层中的矩阵乘法
    Y = torch.matmul(K, X)#矩阵乘法。如果有高维的,会把多出来的一维提取出来,其他部分做矩阵乘法
    '''
    这里的这个矩阵乘法可能有点难以理解,对于Y(i,k),是K中的第i行(输出通道i的卷积核)乘上h*w这一长度的(第k个权重)的求和,
    是满足1*1卷积层的定义的,随后将h*w长的一维向量重构成(h,w)二维向量
    '''
    return Y.reshape((c_o, h, w))

'''1*1卷积层和互相关函数是等价的'''
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值