深度学习——卷积层的输入输出多通道(笔记)+代码

一 输入通道

1.多个输入通道

①彩色图像有RGB(红绿蓝组成)三个通道

②转换为灰度会丢失信息 灰度一个通道

2.多个通道输出的结果:只有一个输出

每个通道都有对应的卷积核,输出的结果是所有通道卷积核的和

【演示】二个通道的输出结果

输出结果某个值的计算:

 3.输入多通道

①输入X:

 ②卷积核W:

 ③输出Y:

单通道。不管输入的是多个通道,每个通道都有对应的卷积核,输出通道的结果是所有卷积核的和。

【比如】:下图的输入通道是2,所以对应2个卷积核(一组),输出结果是单通道。

那么,如何让结果输出多个通道呢?下图是2个卷积核是一组,再加上一组(2个)卷积核。输出就是两个了。每组卷积核提取的特征不一样。结果也就不一样

 

①无论输入通道有多少个,目前只用到单通道输出

②怎样让输出有多个通道呢?可以有多个三维卷积核(多个组),每个核生成一个输出通道

 

 

Ci:输入通道的层数

Co:输出通道的层数

为了提取不同的特征,两者没有相关性。

我的猜测是,比如有一个图片,加上一个滤镜(一组卷积核),是朦胧的。加上另一个滤镜(一组卷积核)是黑白的。所以输出两个图片:朦胧。黑白。

4.多输出的作用:

①每个输出通道可以识别特定的模式

输入一个猫:

 输出的6个通道模式:

 ②把输出的6个通道传入,此刻的输入通道识别并组合输入中的各个模式【组合模式识别】

5: 1*1的卷积层(受欢迎的卷积核)

因为只识别一个像素点,不去看像素周围的像素是多少。所以不识别空间模式。

通过一组卷积核,把输入的三个通道的信息对应像素进行加权和,得到一个输出通道。所以是融合通道。

 【等价于】把输入的三个通道拉成一个向量的全连接层,不考虑空间信息

6. 二维卷积层:

 

 

【总结】

①输出通道数是卷积层的超参数

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

③每个输出通道有独立的三维卷积核。

【代码实现】

1.多输入通道:  输入多个通道验证卷积核1*1等价于全连接层:

import torch
from d2l import torch as d2l


# 多输入通道
def corr2d_multi_in(X, K):
    '''先遍历X和K的第0个维度,再把他们加在一起'''
    '''zip函数用于将可迭代的对象作为参数,将对象的对应的元素打包成一个个元组,返回元组组成的列表'''
    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]]])

corr2d_multi_in(X, K)

输出结果:

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

2.多输出通道

def corr2d_multi_in_out(X, K):
    '''
    迭代“K”的第0个维度,每次都对输入“X”执行互相关运算。
    最后将所有结果都叠加在一起
    torch.stack()沿着一个新维度对输入张量连接,序列中的所有张量一个形状
    '''
    return torch.stack([corr2d_multi_in(X, k) for k in K], 0)

3.构造几组卷积核: 3组卷积核,有三个输出

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

【输出K】

tensor([[[[0., 1.],
          [2., 3.]],

         [[1., 2.],
          [3., 4.]]],


        [[[1., 2.],
          [3., 4.]],

         [[2., 3.],
          [4., 5.]]],


        [[[2., 3.],
          [4., 5.]],

         [[3., 4.],
          [5., 6.]]]])
torch.Size([3, 2, 2, 2])

4.验证:实现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))

【验证 卷积的结果 和 全连接层 相减为0 说明相等】

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)
print(float(torch.abs(Y1 - Y2).sum()) < 1e-6)  # True =0相等。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年8月22日
下一篇 2023年8月22日

相关推荐