笔记小结:卷积神经网络之多输入多输出通道

本文为李沐老师《动手学深度学习》笔记小结,用于个人复习并记录学习历程,适用于初学者

彩色图像具有标准的RGB通道来代表红、绿和蓝,需要三个通道表示,故而只有单输入单输出是不够的。

对于单个输入和单个输出通道的简化例子,可以将输入、卷积核和输出看作二维张量。当我们添加通道时,我们的输入和隐藏的表示都变成了三维张量。例如,每个RGB输入图像具有3×ℎ×𝑤的形状。我们将这个大小为3的轴称为通道(channel)维度

多输入通道

复制代码
import torch

def corr2d(X, K):  #@save
    """计算二维互相关运算"""
    h, w = K.shape #记录K的行数和列数
    Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))
    for i in range(Y.shape[0]):
        for j in range(Y.shape[1]):
            Y[i, j] = (X[i:i + h, j:j + w] * K).sum()
    return Y

def corr2d_multi_in(X, K):
    # 先遍历"X"和"K"的第0个维度(通道维度),再把它们加在一起
    return sum(corr2d(x, k) for x, k in zip(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.]])

多输出通道

ci和𝑐𝑜分别表示输入和输出通道的数目,并让𝑘ℎ和𝑘𝑤为卷积核的高度和宽度。为了获得多个通道的输出,我们可以为每个输出通道创建一个形状为𝑐𝑖×𝑘ℎ×𝑘𝑤的卷积核张量,这样卷积核的形状是𝑐𝑜×𝑐𝑖×𝑘ℎ×𝑘𝑤。在互相关运算中,每个输出通道先获取所有输入通道,再以对应该输出通道的卷积核计算出结果。

如下所示,我们实现一个计算多个通道的输出的互相关函数

复制代码
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.tensor([[[0.0, 1.0],
                   [2.0, 3.0]],
                  [[1.0, 2.0], 
                   [3.0, 4.0]]])
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卷积层

复制代码
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

小结

  • 多输入多输出通道可以用来扩展卷积层的模型。
  • 当以每像素为基础应用时,1×1卷积层相当于全连接层。
  • 1×1卷积层通常用于调整网络层的通道数量和控制模型复杂性。
相关推荐
Allen_LVyingbo26 分钟前
数智读书笔记系列035《未来医疗:医疗4.0引领第四次医疗产业变革》
人工智能·经验分享·笔记·健康医疗
岑梓铭34 分钟前
考研408《计算机组成原理》复习笔记,第三章(3)——多模块存储器
笔记·考研·408·计算机组成原理
菜菜why1 小时前
MSPM0G3507学习笔记(一) 重置版:适配逐飞库的ti板环境配置
笔记·学习·电赛·嵌入式软件·mspm0
c7691 小时前
【文献笔记】Automatic Chain of Thought Prompting in Large Language Models
人工智能·笔记·语言模型·论文笔记
X_StarX2 小时前
【Unity笔记01】基于单例模式的简单UI框架
笔记·ui·unity·单例模式·游戏引擎·游戏开发·大学生
智者知已应修善业4 小时前
【51单片机用数码管显示流水灯的种类是按钮控制数码管加一和流水灯】2022-6-14
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
孞㐑¥7 小时前
Linux之Socket 编程 UDP
linux·服务器·c++·经验分享·笔记·网络协议·udp
sealaugh3210 小时前
aws(学习笔记第四十八课) appsync-graphql-dynamodb
笔记·学习·aws
freexyn12 小时前
Matlab自学笔记六十一:快速上手解方程
数据结构·笔记·matlab
很小心的小新13 小时前
12、jvm运行期优化
java·开发语言·jvm·笔记