动手学深度学习——卷积层里的多个输入和输出通道

1、多个输入通道

彩色图像可能有RGB三个通道,转化为灰度会丢失信息。

每个通道都有一个卷积核,结果是所有通道卷积结果的和。

动手学深度学习——卷积层里的多个输入和输出通道_第1张图片

用公式表示:

动手学深度学习——卷积层里的多个输入和输出通道_第2张图片

2、多个输出通道

无论有多少个输入通道,到目前为止我们只用到单输出通道;我们可以有多个三维卷积核,每个核生成一个输出通道。

动手学深度学习——卷积层里的多个输入和输出通道_第3张图片

每个输出通道可以识别特定模式;输入通道核识别并组合输入中的模式。

3、1x1的卷积层

kh=kw=1是一个受欢迎的选择,他不识别空间模式,只是融合通道;

1x1的卷积层也可以说是全连接层;

卷积层通常⽤来调整⽹络层之间的通道数,并控制模型复杂度。
4、总结
输出通道数是卷积层的超参数;
每个输入通道有独立的二维卷积核,所有通道结果相加得到一个输出通道结果;
每个输出通道有独立的三维卷积核。
5、代码实现

import torch
from torch import nn
import sys
sys.path.append("..")
import d2lzh_pytorch as d2l
"""多输入通道
实现含多个输入通道的互相关运算。我们只需要对每个通道做互相关运算,然后通过add_n函数来进行累加
"""
def corr2d_multi_in(X, K):
 # 沿着X和K的第0维(通道维)分别计算再相加
   res = d2l.corr2d(X[0, :, :], K[0, :, :])
   for i in range(1, X.shape[0]):
        res += d2l.corr2d(X[i, :, :], K[i, :, :])
   return res

#构造数组x和数组k来验证互相关运算的输出
X = torch.tensor([[[0, 1, 2], [3, 4, 5], [6, 7, 8]],[[1, 2, 3], [4, 5, 6], [7, 8, 9]]])
K = torch.tensor([[[0, 1], [2, 3]], [[1, 2], [3, 4]]])
print(corr2d_multi_in(X, K))

"""多输出通道
实现一个互相关运算函数来计算多个通道的输出
"""
def corr2d_multi_in_out(X, K):
 # 对K的第0维遍历,每次同输⼊X做互相关计算。所有结果使⽤stack函数合并在⼀起
      return torch.stack([corr2d_multi_in(X, k) for k in K])
K = torch.stack([K, K + 1, K + 2]) #构成一个通道数为三的卷积核
print(K.shape)
#此时在输出有三个通道
print(corr2d_multi_in_out(X, K))

"""1x1卷积层
窗口大小为1x1的多通道卷积层,输⼊和输出具有相同的⾼和宽。输出中的每个元素来⾃输⼊中在⾼和宽上相同位置的元素在不同通道之间的按权᯿累加。
假设我们将通道维当作特征维,将⾼和宽维度上的元素当成数据样本,那么 卷积层的作⽤与全连接层等价。
"""
#使用全连接层中的举矩阵乘法来实现1x1卷积。
def corr2d_multi_in_out_1x1(X, K):
   c_i, h, w = X.shape
   c_o = K.shape[0]
   X = X.view(c_i, h * w)
   K = K.view(c_o, c_i)
   Y = torch.mm(K, X) # 全连接层的矩阵乘法
   return Y.view(c_o, h, w)

X = torch.rand(3, 3, 3)
K = torch.rand(2, 3, 1, 1)
Y1 = corr2d_multi_in_out_1x1(X, K)
Y2 = corr2d_multi_in_out(X, K)
print((Y1 - Y2).norm().item() < 1e-6)

动手学深度学习——卷积层里的多个输入和输出通道_第4张图片

 

你可能感兴趣的:(动手学深度学习,深度学习,cnn,人工智能,神经网络,pytorch)