卷积层里的多输入多输出

一、定义

1、黑白图片通道为一,彩色图片通道为3

2、多个输入通道:每个通道都有一个卷积核,结果是所有通道卷积结果的和

3、多输入通道

    c是channel,每个通道都有一个偏移,是长为i的向量,相应的卷积核也会变为一个三维的张量

    每一个输出的通道都有一个三维的卷积核,这个三维卷积核输出自己的一个通道,再将每一个叠加起来得到多通道输出的结果;

4、多个输出通道

(1)对每一个输入,它对应C_o维度个的三维核,核拿出来与每一个输出通道一一做运算,就会得一个输入的三维矩阵对应它的多个输出通道;

(2)一个核负责找一个特征,输出该特征代表的特征图;每一个输出通道在识别一个特殊的模式;输入通道核识别并组合输入中的模式

5、多个输入与多个输出通道

(1)每个输出通道可以识别特定模式

(2)输入通道核识别并组合输入中的模式,通过调整核中的权重得到我们最终想要的特征

二、1*1卷积层

1、输入通道数*输出通道数是1*1卷积层需要的权重维度

2、不识别空间模式,只融合通道

三、二维卷积层

1、偏差是因为对于每一个卷积核都有一个偏差

2、复杂度(Kh​×Kw​×Cin)x(Hout​×Wout×Cout​):

        (1)每一次卷积涉及Kh​×Kw的区域(核的大小)

        (2)要得到一个输出,需要在输入维度上进行加和,故要得到一个输出需要Kh​×Kw​×Cin​

        (3)对于输出的总数应该为输出维度乘以每个输出特征图的大小也就是Hout​×Wout×Cout​

        (4)得到复杂度为(Kh​×Kw​×Cin)x(Hout​×Wout×Cout​)

四、总结

(1)输出通道数是卷积层的超参数

(2)每个输入通道有独立的二维卷积核,所有通道结果相加得到一个输出通道结果

(3)每个输出通道有独立的三维卷积核

五、代码

1、多输入通道(二维的互相关运算可以处理多输入的函数)

import torch
from d2l import torch as d2l

def corr2d_multi_in(X, K):
    # 先遍历“X”和“K”的第0个维度(通道维度),再把它们加在一起
    #X 是输入张量,3维;K 是卷积核张量,3维;最后对所有的输入通道求和
    return sum(d2l.corr2d(x, k) for x, k in zip(X, K))

2、多输出通道

def corr2d_multi_in_out(X, K):
    #K是一个四维卷积核,K的形状为 (C_out, C_in, K_h, K_w),其中 C_out是输出通道数,C_in是输入通道数,K_h和 K_w分别是卷积核的高度和宽度。
    #迭代“K”的第0个维度( C_out),每次都对输入“X”执行互相关运算,最后将所有结果都叠加在一起
    #在0的维度上叠加,stack会增加一个0的维度,形成多输出通道的结果
    return torch.stack([corr2d_multi_in(X, k) for k in K], 0)
#这行代码创建了一个新的卷积核张量(四维),形状为 (C_out, C_in, K_h, K_w);torch.stack((K, K + 1, K + 2), 0)将原来的卷积核 K、K + 1和 K + 2叠加在一起,形成一个具有3个输出通道的卷积核张量
#因为之前的k三维的,我们要生成一个四维的
K = torch.stack((K, K + 1, K + 2), 0)
#调用 corr2d_multi_in_out函数,计算输入张量X和卷积核张量K之间的多输入多输出通道的二维卷积
corr2d_multi_in_out(X, K)

3、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))
    #将C_o*C_i*1*1变成二维
    K = K.reshape((c_o, c_i))
    # 全连接层中的矩阵乘法
    Y = torch.matmul(K, X)
    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)    #1*1卷积
assert float(torch.abs(Y1 - Y2).sum()) < 1e-6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值