卷积层里的多输入与多输出通道(channel)

目录

一、多输入输出通道

1、多输入通道

2、多输出通道

3、1×1卷积层

4、二维卷积层的计算复杂度

5、总结

二、代码实现

1、多输入通道

2、多输出通道

3、1×1卷积层

4、总结


一、多输入输出通道

1、多输入通道

       下图是多输入通道、单输出通道的情况:每个通道都有自己的卷积核,每个通道卷积后的输出相加得到结果。

       多通道输入、单通道输出的情况可以用公式来进行表示:

$c_i$:输入通道数

$n_h,n_w$:输入的高和宽

$k_h,k_w$:卷积核的高和宽

$m_h,m_w$:输出的高和宽

这里忘记写偏移bias了,偏移应该也为一个长为 $c_i$ 的一个向量。

2、多输出通道

       如果输入是R,G,B三通道时,输出只有单通道有时候不太够用。如果想要输出也有多个通道,我们可以对每个输出的通道都有一个自己的三维卷积核,每个核生成一个输出通道。

       多通道输入、多通道输出的情况可以用公式来进行表示:

$c_i$:输入通道数

$n_h,n_w$:输入的高和宽

$k_h,k_w$:卷积核的高和宽

$m_h,m_w$:输出的高和宽

$c_o$:输出通道数

       多个输入输出通道的原理:可以认为每一个输出通道在识别某一个特别的模式(比如说输出纹理、边缘等信息),然后在下一层神经网络对上一层的输出进行加权形成一个组合的模式识别。对于一个深层的神经网络来说,当一张图片传进来的时候,最下层学习到的是一些局部的小纹理等特征,上层则会把一些局部的纹理给组合起来,一层一层逐层递进。

       比如说要识别猫:下层先识别猫胡须的纹理、耳朵的纹理等,上层则会把这些纹理组合起来,形成猫头、猫腿等,最上层会组合所有的信息来识别猫。

3、1×1卷积层

       $ 1\times 1 $ 的卷积核的高和宽都等于1,意味着它不会去识别空间信息,因为它每次只看一个像素,它所做的是去融合通道的信息

4、二维卷积层的计算复杂度

       可以简单认为对于每一个输出的像素,都需要进行 $c_i \times k_h \times k_w$ 次运算,然后输出有 $c_o$ 层(通道),每个层(通道)有 $m_h \times m_w$ 个像素,因此计算复杂度为 $c_i \times c_o \times k_h \times k_w \times m_h \times m_w$

5、总结

二、代码实现

1、多输入通道

       当输入包含多个通道时,需要构造一个与输入数据具有相同输入通道数的卷积核,以便与输入数据进行互相关运算。假设输入的通道数为 $c_i$,那么卷积核的输入通道数也需要为 $c_i$。如果卷积核的窗口形状是 $k_h\times k_w$,那么当 $c_i=1$ 时,我们可以把卷积核看作形状为 $k_h\times k_w$ 的二维张量。

       然而,当 $c_i>1$ 时,我们卷积核的每个输入通道将包含形状为 $k_h\times k_w$ 的张量。将这些张量 $c_i$ 连结在一起可以得到形状为 $c_i\times k_h\times k_w$ 的卷积核。由于输入和卷积核都有 $c_i$ 个通道,我们可以对每个通道输入的二维张量和卷积核的二维张量进行互相关运算,再对通道求和(将 $c_i$ 的结果相加)得到二维张量。这是多通道输入和多输入通道卷积核之间进行二维互相关运算的结果。

       下面的代码是对上图互相关运算的实现:

import torch
from d2l import torch as d2l
def corr2d_multi_in(X, K):  # X:3D  K:3D
    # 先遍历“X”和“K”的第0个维度(通道维度),再把它们加在一起
    return sum(d2l.corr2d(x, k) for x, k in zip(X, K))  # 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):  # X:3D  K:4D
    # 迭代“K”的第0个维度,每次都对输入“X”执行互相关运算。
    # 最后将所有结果都叠加在一起
    return torch.stack([corr2d_multi_in(X, k) for k in K], 0)   # k:3D  corr2d_multi_in(X, k):2D

       通过将核张量`K`与`K+1`(`K`中每个元素加1)和`K+2`连接起来,构造了一个具有3个输出通道的卷积核。

K = torch.stack((K, K + 1, K + 2), 0)   # 创建3个输出通道
print(K.shape)  # (channel_ouput, channel_input, kernel_height, kernel_width):(3, 2, 2, 2)
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.]]])

3、1×1卷积层

       因为使用了最小窗口,$1\times 1$ 卷积失去了卷积层的特有能力——在高度和宽度维度上,识别相邻元素间相互作用的能力。其实 $1\times 1$ 卷积的唯一计算发生在通道上。

       下面,我们使用全连接层实现 $1 \times 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\times 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

4、总结

  • 多输入多输出通道可以用来扩展卷积层的模型。
  • 当以每像素为基础应用时,$1\times 1$ 卷积层相当于全连接层。
  • $1\times 1$ 卷积层通常用于调整网络层的通道数量和控制模型复杂性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/259506.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

.NET 药厂业务系统 CPU爆高分析

Windbg 分析 1. CPU 真的爆高吗 还是老规矩&#xff0c;要想找到这个答案&#xff0c;可以使用 !tp 命令。 0:044> !tp logStart: 1 logSize: 200 CPU utilization: 88 % Worker Thread: Total: 8 Running: 4 Idle: 4 MaxLimit: 1023 MinLimit: 4 Work Request in Queue: …

翻译: 负责任的人工智能 Responsible AI

负责任的人工智能指的是以道德、值得信赖和社会负责任的方式开发和使用人工智能。许多开发者、企业和政府都关心这一点&#xff0c;并且一直在进行对话&#xff0c;也在努力确保人工智能的构建和使用是负责任的。由于对负责任的人工智能的所有这些关注和努力&#xff0c;我们在…

网线制作,集线器、交换机、路由器的介绍以及路由器的设置

目录 一. 网线制作 1.1 制作材料 1.2 网线标准 1.3 网线做法 二. 集线器、交换机、路由器介绍 前言 简介 简单来说 三. 路由器的设置 设置1 设置2 设置3 设置4 无线设置 一. 网线制作 1.1 制作材料 网线 …

【进阶篇】YOLOv8实现K折交叉验证——解决数据集样本稀少和类别不平衡的难题,让你的模型评估更加稳健

YOLOv8专栏导航&#xff1a;点击此处跳转 K折交叉验证 K折交叉验证&#xff08;K-Fold Cross-Validation&#xff09;是一种常用的机器学习模型评估方法&#xff0c;可以帮助我们评估模型的性能&#xff0c;特别适用于数据集相对较小的情况。 在K折交叉验证中&#xff0c;将原…

CUMT--Java--JDBC编程

目录 一、JDBC简介 二、数据库访问 1、加载数据库驱动 2、建立数据连接 3、创建Statement对象 4、执行SQL语句 5、访问结果集 三、MetaData接口 1、DatabaseMetaData接口 2、ResultSetMetaData接口 四、事务 1、JDBC中的事务 2、保存点 3、批量更新 一、JDBC简…

若依(ruoyi)管理系统标题和logo修改

1、网页上的logo 2、页面中的logo 进入ruoyi-ui --> src --> assets --> logo --> logo.png&#xff0c;把这个图片换成你自己的logo 3、网页标题 进入ruoyi-ui --> src --> layout --> components --> Sidebar --> Logo.vue&#xff0c;将里面的…

第二周:AI产品经理全局学习

一、AI产品架构全景 二、 AI产品岗位分析和了解 三、 AI产品能力模型 四、AI产品经理工作流 五、AI产品经理学习路径和规划 六、本周市场动态

VM安装Sonoma【笔记】

VMware Workstation安装MacOS Sonoma 1、配置虚拟机&#xff0c;根据系统性能调整参数&#xff1b; 2、先不焦急启动虚拟机&#xff0c;打开虚拟机存储目录&#xff0c;以文本方式打开.vmx文件&#xff08;这里以Sonoma.vmx为例&#xff09;&#xff1b; 这里只针对Inter CP…

select和poll

slelect实现客户端 #include <myhead.h> #define PORT 8888 #define PORT1 9999 #define IP "192.168.125.147" int main(int argc, const char *argv[]) {int cfd-1;if((cfdsocket(AF_INET,SOCK_STREAM,0))-1){perror("socket error");return -1…

Go语言字符串综合指南:函数、方法和最佳实践

Go语言字符串综合指南&#xff1a;函数、方法和最佳实践 引言Go语言字符串基础声明和初始化不可变性字符串长度 字符串操作函数常用字符串操作转换与解析示例连接分割包含关系替换大小写转换整数与字符串的转换字符串到整数的转换格式化与解析 字符串与字符切片字符串和字符切片…

WINDOWS(WIN11)通过IP添加网络打印机

点击添加设备 点击手动添加 使用IP地址或主机名添加打印机 选择TCP/IP设备&#xff0c;输入打印机地址 如果有正确驱动就安装&#xff0c;没有就取消。 通过手动设置添加本地打印机或网络打印机 使用现有的端口 根据打印机IP&#xff0c;选择标准端口。 成功&#xff01; 到…

【LeetCode刷题笔记(12-1)】【Python】【有效的字母异位词】【排序/字符统计】【简单】

文章目录 引言有效的字母异位词题目描述提示 解决方案1&#xff1a;【排序】解决方案2&#xff1a;【字符统计】结束语 有效的字母异位词 引言 编写通过所有测试案例的代码并不简单&#xff0c;通常需要深思熟虑和理性分析。虽然这些代码能够通过所有的测试案例&#xff0c;但…

贪吃蛇(三)绘制蛇身

绘制蛇身的逻辑不难&#xff0c;存储上面使用结构体。 第一行和第十九行绘制--其它行&#xff0c;绘制|&#xff0c;分别在头尾处。 (1) 扫描蛇身&#xff0c;如果扫描到则绘制[]。 (2) 扫描蛇身&#xff0c;如果扫描不到则绘制空白。 #include"curses.h"struct Sn…

cpulimit设计理念及其思考

背景 前几天&#xff0c;同事咨询了我一个问题&#xff1a;IO占用能和cpu使用率那样&#xff0c;有方法来控制吗&#xff1f;这个问题的背景是因为客户提了两个需求&#xff0c;如下&#xff1a; 说实话&#xff0c;针对这两点需求&#xff0c;我的第一反应是有一点思路&#…

第二节TypeScript 基础语法

1、typescript程序由以下几个部分组成&#xff1a; 模块函数变量语句和表达式注释 2、开始第一个typescript程序 创建一个typescript程序&#xff0c;使之输出“hello typescript”&#xff1a; 代码&#xff1a; var message:string "hello typescript" cons…

MaBatis使用`ResultMap`标签手动映射详解使用

文章目录 MaBatis使用ResultMap标签手动映射详解使用1、MyBatis只能自动维护库表”列名“与”属性名“相同时的对应关系&#xff0c;二者不同时无法自动ORM&#xff0c;如下&#xff1a;2、在SQL中使用 as 为查询字段添加列别名&#xff0c;以匹配属性名&#xff1a;但是如果我…

(7)Linux GDB以及gcc和g++

&#x1f4ad; 前言 本章我们将带着大家高雅的学一学令众多习惯图形化页面的朋友难受的 gdb 调试&#xff0c;这部分知识可以选择性学习学习&#xff0c;以后倘若遇到一些问题时能在 Linux 内简单调试&#xff0c;还是很香的。然后在讲讲 gcc 和 g&#xff0c;系统讲解程序运行…

基于STC89C51单片机实现的森林防火系统源码+仿真+原理图+设计报告,含视频讲解

森林防火 摘要 森林防火是非常必要的,火灾对森林的破坏是具有毁灭性的,有着很大的危害,在春秋季节森林火灾高发期,若发生火灾,对人民生活带来极大危害,不仅危害人们生产生活,而且对地球环境产生影响.本课题研究的内容是以单片机STC89C51为控制核心&#xff0c;以MQ-2型半导体电…

YZ系列工具之YZ02:字典的多功能应用

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套一部VBA手册&#xff0c;教程分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的…

C : DS二叉排序树之删除

Description 给出一个数据序列&#xff0c;建立二叉排序树&#xff0c;并实现删除功能 对二叉排序树进行中序遍历&#xff0c;可以得到有序的数据序列 Input 第一行输入t&#xff0c;表示有t个数据序列 第二行输入n&#xff0c;表示首个序列包含n个数据 第三行输入n个数据…