多输入通道和多输出通道

2023-11-18

【目录】

1. 什么是多输入通道和多输出通道

在卷积神经网络(Convolutional Neural Network,CNN)中,多输入通道和多输出通道是两个非常重要的概念。在介绍多输入通道和多输出通道之前,我们先来回顾一下卷积神经网络中的卷积操作。

卷积神经网络中的卷积操作是指,将输入张量与卷积核进行卷积操作,得到输出张量的过程。其中,输入张量和卷积核都是多维数组,通常都是三维数组。在卷积操作中,输入张量的每个二维数组都称为一个输入通道,卷积核的每个二维数组都称为一个输出通道。

多输入通道和多输出通道则是指,输入张量和输出张量分别包含多个输入通道和输出通道的情况。具体来说,多输入通道指的是输入张量包含多个二维数组,即包含多个输入通道;多输出通道指的是输出张量包含多个二维数组,即包含多个输出通道。

2. 多输入通道和多输出通道的实现

在卷积神经网络中,多输入通道和多输出通道的实现方式主要有两种:多输入通道和多输出通道的卷积操作、多输入通道和多输出通道的全连接操作。下面我们将分别介绍这两种实现方式。

2.1 多输入通道和多输出通道的卷积操作

在多输入通道和多输出通道的卷积操作中,输入张量和卷积核的维度分别为 n i × c i × h i × w i n_i \times c_i \times h_i \times w_i ni×ci×hi×wi n o × c i × k h × k w × c o n_o \times c_i \times k_h \times k_w \times c_o no×ci×kh×kw×co,其中 n i n_i ni n o n_o no 分别是输入张量和输出张量的样本数, c i c_i ci 是输入张量的通道数, h i h_i hi w i w_i wi 分别是输入张量的高度和宽度, k h k_h kh k w k_w kw 分别是卷积核的高度和宽度, c o c_o co 是输出张量的通道数。具体来说,假设输入张量为 X X X,卷积核为 W W W,输出张量为 Y Y Y,则多输入通道和多输出通道的卷积操作可以表示为:

y n , o , h , w = ∑ i = 1 c i ∑ j = 1 k h ∑ k = 1 k w x n , i , h + j − 1 , w + k − 1 w i , j , k , o y_{n,o,h,w} = \sum_{i=1}^{c_i} \sum_{j=1}^{k_h} \sum_{k=1}^{k_w} x_{n,i,h+j-1,w+k-1} w_{i,j,k,o} yn,o,h,w=i=1cij=1khk=1kwxn,i,h+j1,w+k1wi,j,k,o

其中, y n , o , h , w y_{n,o,h,w} yn,o,h,w 表示输出张量 Y Y Y 的第 n n n 个样本、第 o o o 个输出通道、第 h h h 行、第 w w w 列的值; x n , i , h + j − 1 , w + k − 1 x_{n,i,h+j-1,w+k-1} xn,i,h+j1,w+k1 表示输入张量 X X X 的第 n n n 个样本、第 i i i 个输入通道、第 h + j − 1 h+j-1 h+j1 行、第 w + k − 1 w+k-1 w+k1 列的值; w i , j , k , o w_{i,j,k,o} wi,j,k,o 表示卷积核 W W W 的第 i i i 个输入通道、第 j j j 行、第 k k k 列、第 o o o 个输出通道的值。

2.2 多输入通道和多输出通道的全连接操作

在多输入通道和多输出通道的全连接操作中,输入张量和输出张量的维度分别为 n i × c i × h i × w i n_i \times c_i \times h_i \times w_i ni×ci×hi×wi n o × c o n_o \times c_o no×co,其中 n i n_i ni n o n_o no 分别是输入张量和输出张量的样本数, c i c_i ci 是输入张量的通道数, h i h_i hi w i w_i wi 分别是输入张量的高度和宽度, c o c_o co 是输出张量的通道数。具体来说,假设输入张量为 X X X,全连接层的权重为 W W W,输出张量为 Y Y Y,则多输入通道和多输出通道的全连接操作可以表示为:

y n , o = ∑ i = 1 c i ∑ j = 1 h i ∑ k = 1 w i x n , i , j , k w i , j , k , o y_{n,o} = \sum_{i=1}^{c_i} \sum_{j=1}^{h_i} \sum_{k=1}^{w_i} x_{n,i,j,k} w_{i,j,k,o} yn,o=i=1cij=1hik=1wixn,i,j,kwi,j,k,o

其中, y n , o y_{n,o} yn,o 表示输出张量 Y Y Y 的第 n n n 个样本、第 o o o 个输出通道的值; x n , i , j , k x_{n,i,j,k} xn,i,j,k 表示输入张量 X X X 的第 n n n 个样本、第 i i i 个输入通道、第 j j j 行、第 k k k 列的值; w i , j , k , o w_{i,j,k,o} wi,j,k,o 表示全连接层的权重,表示输入通道为 i i i、高度为 j j j、宽度为 k k k、输出通道为 o o o 的权重值。

3. 多输入通道和多输出通道的实例

下面我们使用 PyTorch 来实现一个多输入通道和多输出通道的卷积神经网络,并对其进行训练和测试。具体来说,我们将使用 CIFAR-10 数据集,该数据集包含 10 类物体的彩色图像。每张图像的大小为 32 × 32 32 \times 32 32×32,共有 3 个通道(即 RGB 三个通道)。我们将使用一个包含多个卷积层和全连接层的卷积神经网络来对 CIFAR-10 数据集进行分类。

3.1 导入必要的库和数据集

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms

# 定义数据增强的操作
transform_train = transforms.Compose([
    transforms.RandomCrop(32, padding=4),  # 随机裁剪
    transforms.RandomHorizontalFlip(),  # 随机水平翻转
    transforms.ToTensor(),  # 转为张量
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))  # 归一化
])
transform_test = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

# 加载训练集和测试集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform_train)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2)
testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform_test)
testloader = torch.utils.data.DataLoader(testset, batch_size=100, shuffle=False, num_workers=2)

3.2 定义卷积神经网络

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # 第一层卷积层
        self.conv1 = nn.Conv2d(3, 6, 5)
        # 第二层卷积层
        self.conv2 = nn.Conv2d(6, 16, 5)
        # 第三层全连接层
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        # 第四层全连接层
        self.fc2 = nn.Linear(120, 84)
        # 第五层全连接层
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        # 第一层卷积层
        x = self.conv1(x)
        x = nn.functional.relu(x)
        x = nn.functional.max_pool2d(x, 2)
        # 第二层卷积层
        x = self.conv2(x)
        x = nn.functional.relu(x)
        x = nn.functional.max_pool2d(x, 2)
        # 第三层全连接层
        x = x.view(-1, 16 * 5 * 5)
        x = self.fc1(x)
        x = nn.functional.relu(x)
        # 第四层全连接层
        x = self.fc2(x)
        x = nn.functional.relu(x)
        # 第五层全连接层
        x = self.fc3(x)
        return x

net = Net()

3.3 训练卷积神经网络

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

for epoch in range(10):
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data

        optimizer.zero_grad()

        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 100 == 99:
            print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 100))
            running_loss = 0.0

3.4 测试卷积神经网络

correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total))

4 结构图和计算

Input
Convolutional Layer
Output
Input 1
Convolutional Layer 1
Input 2
Output 1

其中,A表示单通道输入,A1和A2表示多通道输入;B表示单通道卷积层,B1表示多通道卷积层;C表示单通道输出,C1表示多通道输出。

对于多输入通道和多输出通道的卷积神经网络,其计算过程与单通道的卷积神经网络类似,只是在输入和输出的张量维度上会有所不同。

假设输入张量为 X ∈ R C i n × H i n × W i n X\in R^{C_{in}\times H_{in}\times W_{in}} XRCin×Hin×Win,其中 C i n C_{in} Cin表示输入通道数, H i n H_{in} Hin W i n W_{in} Win分别表示输入张量的高和宽;卷积核张量为 W ∈ R C o u t × C i n × K H × K W W\in R^{C_{out}\times C_{in}\times K_H\times K_W} WRCout×Cin×KH×KW,其中 C o u t C_{out} Cout表示输出通道数, K H K_H KH K W K_W KW分别表示卷积核的高和宽;输出张量为 Y ∈ R C o u t × H o u t × W o u t Y\in R^{C_{out}\times H_{out}\times W_{out}} YRCout×Hout×Wout,其中 H o u t H_{out} Hout W o u t W_{out} Wout分别表示输出张量的高和宽。

对于单通道输入和单通道输出的情况,卷积运算的计算过程如下:

Y k , i , j = ∑ c = 1 C i n ∑ p = 1 K H ∑ q = 1 K W W k , c , p , q X c , ( i − 1 ) × s + p , ( j − 1 ) × s + q + b k Y_{k,i,j}=\sum_{c=1}^{C_{in}}\sum_{p=1}^{K_H}\sum_{q=1}^{K_W}W_{k,c,p,q}X_{c,(i-1)\times s+p,(j-1)\times s+q}+b_k Yk,i,j=c=1Cinp=1KHq=1KWWk,c,p,qXc,(i1)×s+p,(j1)×s+q+bk

其中, Y k , i , j Y_{k,i,j} Yk,i,j表示输出张量 Y Y Y中第 k k k个通道、第 i i i行、第 j j j列的元素; W k , c , p , q W_{k,c,p,q} Wk,c,p,q表示卷积核张量 W W W中第 k k k个通道、第 c c c个通道、第 p p p行、第 q q q列的元素; X c , i , j X_{c,i,j} Xc,i,j表示输入张量 X X X中第 c c c个通道、第 i i i行、第 j j j列的元素; s s s表示步幅; b k b_k bk表示偏置项。

对于多输入通道和多输出通道的情况,卷积运算的计算过程如下:

Y k , i , j = ∑ c = 1 C i n ∑ p = 1 K H ∑ q = 1 K W ∑ m = 1 M W k , c , p , q , m X c , ( i − 1 ) × s + p , ( j − 1 ) × s + q , m + b k Y_{k,i,j}=\sum_{c=1}^{C_{in}}\sum_{p=1}^{K_H}\sum_{q=1}^{K_W}\sum_{m=1}^{M}W_{k,c,p,q,m}X_{c,(i-1)\times s+p,(j-1)\times s+q,m}+b_k Yk,i,j=c=1Cinp=1KHq=1KWm=1MWk,c,p,q,mXc,(i1)×s+p,(j1)×s+q,m+bk

其中, M M M表示输入张量 X X X的通道数; Y k , i , j Y_{k,i,j} Yk,i,j W k , c , p , q , m W_{k,c,p,q,m} Wk,c,p,q,m X c , i , j , m X_{c,i,j,m} Xc,i,j,m s s s b k b_k bk的含义同单通道的情况。

5. 总结

本文介绍了卷积神经网络中的多输入通道和多输出通道的概念和实现方式,并使用 PyTorch 实现了一个包含多个卷积层和全连接层的卷积神经网络,对 CIFAR-10 数据集进行了分类

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多输入通道和多输出通道 的相关文章

  • Mac OS 上的诗歌安装失败,显示“should_use_symlinks”

    我正在尝试使用以下命令安装诗歌 curl sSL https install python poetry org python3 但它失败了 但有以下例外 例外 此版本的 python 无法在不使用符号链接的情况下创建 venvs 下面是详
  • 使用 matplotlib 从“列表列表”绘制 3D 曲面

    我已经搜索了一些 虽然我可以找到许多有用的网格网格示例 但没有一个清楚地表明我如何将列表列表中的数据转换为可接受的形式 以适应我所讨论的各种方式 当谈到 numpy matplotlib 以及我所看到的建议的术语和步骤顺序时 我有点迷失 我
  • Python 3 os.urandom

    在哪里可以找到完整的教程或文档os urandom 我需要获得一个随机 int 来从 80 个字符的字符串中选择一个字符 如果你只需要一个随机整数 你可以使用random randint a b 来自随机模块 http docs pytho
  • Twisted 的 Deferred 和 JavaScript 中的 Promise 一样吗?

    我开始在一个需要异步编程的项目中使用 Twisted 并且文档非常好 所以我的问题是 Twisted 中的 Deferred 与 Javascript 中的 Promise 相同吗 如果不是 有什么区别 你的问题的答案是Yes and No
  • 如何以“正确”的方式处理带有空字节的 Python unicode 字符串?

    Question PyWin32 似乎很乐意将 null 终止的 unicode 字符串作为返回值 我想以 正确 的方式处理这些字符串 假设我得到一个像这样的字符串 u C Users Guest MyFile asy x00 x00sy
  • 用缺失的日期填充其他列 Nan Pandas DataFrame

    我实际上是从几个 Excel 文件中提取数据来监控我的每日卡路里摄入量 我设法使用列表理解来生成日期 我尝试使用合并或连接 但它不起作用 ValueError 您正在尝试合并对象和 float64 列 date list 2021 05 2
  • Kivy - 有所有颜色名称的列表吗?

    在 Kivy 中 小部件 color属性允许输入其值作为字符串颜色名称 也 例如在 kv file Label color red 是否有所有可能的颜色名称的列表 就在这里 来自Kivy 的文档 https kivy org doc sta
  • Python - 来自 .进口

    我第一次尝试图书馆 我注意到解决图书馆内导入问题的最简单方法是使用如下结构 from import x from some module import y 我觉得这件事有些 糟糕 也许只是因为我不记得经常看到它 尽管公平地说我还没有深入研究
  • 如何在Python中同时运行两只乌龟?

    我试图让两只乌龟一起移动 而不是一只接着另一只移动 例如 a turtle Turtle b turtle Turtle a forward 100 b forward 100 但这只能让他们一前一后地移动 有没有办法让它们同时移动 有没有
  • Python 2.7 中的断言对我来说不起作用示例assertIn

    我的 Mac 上安装了 python 2 7 通过在终端中运行 python v 进行验证 当我尝试使用任何新的 2 7 断言方法时 我收到 AtributeError 我看过http docs python org 2 library u
  • 工作日重新订购 Pandas 系列

    使用 Pandas 我提取了一个 CSV 文件 然后创建了一系列数据来找出一周中哪几天崩溃最多 crashes by day bc DAY OF WEEK value counts 然后我将其绘制出来 但当然它按照与该系列相同的排名顺序绘制
  • 如何使用文本相似性删除 pandas 数据框中相似(不重复)的行?

    我有数千个数据 这些数据可能相似也可能不相似 使用 python 的默认函数 drop duplicates 并没有真正的帮助 因为它们只检测相似的数据 例如 如果我的数据包含类似以下内容怎么办 嗨 早上好 嗨 早上好 Python 不会将
  • .pyx 文件出现未知文件类型错误

    我正在尝试构建一个包含 pyx 文件的 Python 包 pyregion 但在构建过程中出现错误 检查以下输出 python setup py build running build running build py creating b
  • 使用 python 绘制正值小提琴图

    我发现小提琴图信息丰富且有用 我使用 python 库 seaborn 然而 当应用于正值时 它们几乎总是在低端显示负值 我发现这确实具有误导性 尤其是在处理现实数据集时 在seaborn的官方文档中https seaborn pydata
  • Matplotlib 中 x 轴标签的频率和旋转

    我在下面编写了一个简单的脚本来使用 matplotlib 生成图形 我想将 x tick 频率从每月增加到每周并轮换标签 我不知道从哪里开始 x 轴频率 我的旋转线产生错误 TypeError set xticks got an unexp
  • 如何在 pandas 中使用 read_fwf 跳过空行?

    I use pandas read fwf http pandas pydata org pandas docs stable generated pandas read fwf htmlPython pandas 0 19 2 中的函数读
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • 如何与其他用户一起使用 pyenv?

    如何与其他用户一起使用 pyenv 例如 如果我在用户 test 的环境中安装了 pyenv 则当我以 test 身份登录时可以使用 pyenv 但是 当我以其他用户 例如 root 身份登录时如何使用 pyenv 即使你这么做了 我也会s
  • 将上下文管理器的动态可迭代链接到单个 with 语句

    我有一堆想要链接的上下文管理器 第一眼看上去 contextlib nested看起来是一个合适的解决方案 但是 此方法在文档中被标记为已弃用 该文档还指出最新的with声明直接允许这样做 自 2 7 版起已弃用 with 语句现在支持此
  • 使用ssl和socket的python客户端身份验证

    我有一个 python 服务器 需要客户端使用证书进行身份验证 我如何制作一个客户端脚本 使用客户端证书由 python 中的服务器使用 ssl 和套接字模块进行身份验证 有没有仅使用套接字和 ssl 而不扭曲的示例 from OpenSS

随机推荐

  • 读书笔记 摘自:《思维导图攻略:快速上手与落地实践》

    思维导图攻略 快速上手与落地实践 王健文 出版 2019 01 01 7 3万字 内容提要 无落地 不导图 思维导图的学习并不在于思维导图的绘制本身 而是在于实际应用和思维提升 第一章 精英人士自我提升的思维利器 第一节 提升大脑学习力的秘
  • 广州华锐互动:利用VR复原文化遗址,沉浸式体验历史文物古迹的魅力

    在过去的几十年里 科技发展飞速 为我们打开了无数新的视角和可能性 其中 虚拟现实 Virtual Reality 简称VR 技术的崭新应用 为我们提供了一种全新的 近乎身临其境的体验历史的方式 本文将重点探讨VR技术在复原历史古迹方面的应用
  • How to use tar command to complete file compression and decompression in Ubuntu

    TAR 1 GNU TAR Manual TAR 1 NAME tar an archiving utility SYNOPSIS Traditional usage tar A
  • beam search的例子

    看了一下网上对beam search的讲解 感觉都说的太杂了 我试图用一个最简单的例子来帮助读者理解 见下图 假设我有一个模型 能够根据当前词输出下一个词的概率分布 最后依次这样就能生成一大串文本 以上面的图为例 The 的下一个词的最大概
  • Spring StateMachine使用笔记

    Spring StateMachine使用笔记 配置状态机 状态 分层状态 withStates 配置状态 states状态列表 可以使用多个withStates进行parent分层 配置区域 当相同的分层状态机具有多组状态时 每个都具有初
  • 系统移植开发阶段部署

    开发阶段部署阶段 uboot镜像 ubootpak bin flash SD linux内核镜像 uImage tftp下载 根文件系统 rootfs nfs挂载 本文操作需要用到uboot命令进行镜像搬移和根文件系统挂载 uboot中常用
  • EPS学习笔记3----------常用地物采集方法(房屋,斜坡,台阶)

    1 三维模型中房屋绘制方法 面状地物 五点房 不会自动弹出房屋属性录入窗口 任意绘制法 绘制结束弹出房屋属性录入窗口 多点法 1 首先在房屋某一面用鼠标左键选择一点 2 鼠标移到房屋屋檐处 利用shift A将前一节点高程移到屋檐高程 3
  • 前端开发常见面试题第三篇(Vue和React)

    文章目录 1 Vue中直接获取组件内的DOM元素或子组件实例 2 生命周期 3 双向绑定原理 4 v if和v show的区别 5 Vue导航钩子 6 路由跳转的方式 7 vuex常用的是什么 怎么使用 8 父子组件之间通信 9 跨域处理
  • Java排序算法:选择排序

    Java排序算法 选择排序 选择排序它的主要思想是 在未排序的数组中选择最小的元素 然后将其放置在数组的起始位置 再在剩余的未排序数组中选择最小元素 并将其放置在已排序部分的末尾 重复此过程 直到整个数组排序完成 选择排序的步骤如下 1 从
  • 15款业界公认的最佳视频处理软件

    因为需要购买昂贵的视频处理软件和高性能图形计算机 所以视频处理是一项比较耗费金钱的技术活 正是由于这样 一部分人选择使用性能较好的免费在线编辑软件 无需太多视频处理知识便可在浏览器中剪切和编辑视频 然而 当我们无法连接网络或网络很慢的时候
  • IC卡片使用基础

    一 卡片基本概念 集成电路卡 即日常生活中常使用的卡片 可以根据读写特性分为两类 ID卡和IC卡 ID卡 全称身份识别卡 是一种不可写入的感应卡 含固定编号 卡内除了卡号外 无任何保密功能 其 卡号 是公开 裸漏的 IC卡 带有存储器 又称
  • redis缓存击穿、缓存穿透、缓存雪崩、缓存一致性解决方案的代码实现

    1 0 缓存击穿 概念 一些redis的key过期 同时大量数据请求过期的key或者redis不存在的key 导致大量请求打到数据库 导致数据库瘫痪 解决方案 1 设置热点数据永不过期 2 对热点数据加锁 分布式锁 代码实现 初始化项目 商
  • 【笔记】有点麻烦的MatConvNet的dagnn的debug过程

    尝试用MatConvNet训练 然而遇到了以下bug 一脸懵逼折腾了四天 No public property dilate exists for class dagnn Conv Error in dagnn Layer load lin
  • javaweb课程设计之商品后台管理系统

    主要技术 layui框架 html5 jsp oracle数据库 servlet session filter 功能说明 基于java开发的商品管理系统 管理员在后台进行添加商品 修改商品 删除商品 批量删除商品 设置商品上下架功能等 完美
  • webSocket的使用

    在Spring Boot项目中使用Java WebSocket 添加依赖 在项目的构建文件 如pom xml 中添加Java WebSocket的依赖项 可以使用Java EE的WebSocket API或者其他第三方库 例如 Tyrus
  • MATLAB绘制局部放大图

    在数据处理时 当曲线出现跳变的时间极短 出于观察跳变时间段波形的需要 需要对曲线跳变处进行局部放大处理 本文给出了此种情况下MATLAB绘制局部放大图的流程 同时 当曲线的峰值数据与平均值相差一个数量级时 如峰值12 平均值范围落在是 1间
  • awk内置函数

    http blog csdn net nuoline article details 8610679
  • 【爬虫进阶】猿人学任务七之字体反爬(难度2.0)

    目录 前言 特此说明 分析 代码过程 成果 完整源码 前言 往期有讲解过某团字体反爬 感觉效果不太好 所以本章重新找了个例子 希望能帮助大家理解透彻 再遇到直接手撕 特此说明 如果涉及到版权问题 请立刻联系博主删除 分析 首先 我们看题目
  • C++实现栈(链表模拟)【每一步详细深入讲解,代码清晰、简单、易懂】

    文章目录 一 利用链表实现栈 1 链表实现的思路 2 设计栈的结构 3 入栈操作 4 出栈操作 5 判断栈空 6 构造析构 7 完整代码 一 利用链表实现栈 1 链表实现的思路 由于栈是一种较为简单的数据结构 用链表实现栈 逻辑上和数组差不
  • 多输入通道和多输出通道

    目录 多输入通道和多输出通道 目录 1 什么是多输入通道和多输出通道 2 多输入通道和多输出通道的实现 2 1 多输入通道和多输出通道的卷积操作 2 2 多输入通道和多输出通道的全连接操作 3 多输入通道和多输出通道的实例 3 1 导入必要