深度学习-----------------多个输入和输出通道

news2024/11/24 11:10:54

目录

  • 多个输入通道
  • 多个输出通道
  • 多个输入和输出通道
  • 1×1卷积层
  • 二维卷积层
  • 总结
  • 多输入多输出通道代码实现
    • 多输入单输出通道代码实现
    • 多输出通道代码实现
      • 该部分代码
    • 多输入多输出通道总代码
    • 多个输入和输出通道用途
  • 1×1卷积
    • 该部分总代码
  • 问题

多个输入通道

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

在这里插入图片描述
在这里插入图片描述


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

在这里插入图片描述

输入有2个通道(通道0、通道1),对每一个通道都有一个卷积核。




在这里插入图片描述
c i c_i ci是通道,输入是三维的。核也是三维。




多个输出通道

无论有多少输入通道,到目前为止我们只用到单输出通道。

我们可以有多个三维卷积核,每个核生成一个输出通道

在这里插入图片描述
c o c_o co其实就是 c o u t p u t c_{output} coutput c i c_i ci个通道,每个通道 c o c_o co种卷积核,共有 c i c_i ci* c o c_o co种卷积核。

c i c_i ci:输入通道的(卷积核)层数
c o c_o co:输出通道(卷积核)层数

为了提出不同的特征,两者无相关性。




多个输入和输出通道

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

在这里插入图片描述

输入通道核识别并组合输入中的模式。




1×1卷积层

k h k_h kh= k w k_w kw=1是一个受欢迎的选择。它不识别空间模式,只是融合通道

在这里插入图片描述

通道0和通道1的卷积核
在这里插入图片描述

把output对应输入里面的像素,每个不同的通道做加权和。

在这里插入图片描述

在这里插入图片描述
相当于输入形状为 n h n_ h nh n w n_ w nw× c i c_ i ci(把输入拉成一个 n h n_ h nh n w n_ w nw向量,列数是 c i c_ i ci,整体是一个矩阵),权重为 c i c_ i ci× c o c_ o co的全连接层。




二维卷积层

在这里插入图片描述
一共有 c o c_ o co× c i c_ i ci个卷积核,每个卷积核都有一个偏差。

计算复杂度:
    这么理解:最后输出 m h m_ h mh× m w m_ w mw个点 c o c_ o co个通道,这意味着总共有 c o c_ o co× m h m_ h mh× m w m_ w mw个输出点,对于每个输出点,它都涉及到与卷积核的乘法操作。卷积核的大小为 k h k_h kh× k w k_w kw且输入特征图 c i c_ i ci个通道,那么对于输出特征图上的每一个点,都需要进行 c i c_ i ci× k h k_h kh× k w k_w kw次乘法操作。(因为每个输出点都是输入特征图上对应区域的 c i c_i ci个通道与卷积核的乘积之和)。




总结

    ①输入通道数是卷积层的超参数。
    ②每个输入通道都有独立的二维卷积核,所有通道结果相加得到一个输出通道结果。
    ③每个输出通道有独立的三维卷积核。




多输入多输出通道代码实现

多输入单输出通道代码实现

实现一下多输入通道互相关运算

import torch
from d2l import torch as d2l


def corr2d_multi_in(X, K):
    # for使得对最外面通道进行遍历,先遍历“X”和“K”的第0个维度(通道维度)
    # 使用sum 函数来遍历 X 和 K 的通道,并对每个通道对应用 d2l.corr2d 函数进行二维卷积操作,然后将所有通道的结果相加。
    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]]])

print(corr2d_multi_in(X, K))

输出:

在这里插入图片描述




多输出通道代码实现

计算多个通道的输出的互相关函数

def corr2d_multi_in_out(X, K):
    # 迭代“K”的第0个维度(输出通道),每次都对输入“X”执行互相关运算。
    # 最后将所有结果都叠加在一起
    # torch.stack([...], 0) 将上一步生成的列表中的张量沿着一个新的维度(这里是第0维,即批量大小维度)堆叠起来 
    return torch.stack([corr2d_multi_in(X, k) for k in K], 0)

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

# 要堆叠的张量K、K+1、K+2
# K原来是3D,然后通过stack堆叠成为4D
K = torch.stack((K, K + 1, K + 2), 0)
print(K.shape)

输出:输出是3,输入是2,高和宽分别是2(3个卷积核,每个卷积核有两个通道,每个通道是2×2的矩阵)
在这里插入图片描述




①为什么原先K形状是torch.Size([2, 2, 2]),后来变成了torch.Size([3, 2, 2, 2])?
三个堆起来就是最外层3.



②输入为什么是2?
因为X的通道是2

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、K+1、K+2(左),后来堆叠的(右)

在这里插入图片描述在这里插入图片描述


该部分代码

import torch

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]]])
print(X.shape)
K = torch.tensor([[[0.0, 1.0], [2.0, 3.0]], [[1.0, 2.0], [3.0, 4.0]]])
print(K.shape) # torch.Size([2, 2, 2]) 两块2行2列
print(K)
print(K+1)
print(K+2)
K = torch.stack((K, K + 1, K + 2), 0)
print(K)
print(K.shape)



输入张量X卷积核张量K执行互相关运算。现在的输出包含3个通道,第一个通道的结果与先前输入张量X和多输入单输出通道的结果一致。

corr2d_multi_in_out(X, K)

多输入多输出通道总代码

import torch
from d2l import torch as d2l


def corr2d_multi_in(X, K):
    # for使得对最外面通道进行遍历,先遍历“X”和“K”的第0个维度(通道维度)
    # 使用sum 函数来遍历 X 和 K 的通道,并对每个通道对应用 d2l.corr2d 函数进行二维卷积操作,然后将所有通道的结果相加。
    return sum(d2l.corr2d(x, k) for x, k in zip(X, K))


def corr2d_multi_in_out(X, K):
    # 迭代“K”的第0个维度(输出通道),每次都对输入“X”执行互相关运算。
    # 最后将所有结果都叠加在一起
    # torch.stack([...], 0) 将上一步生成的列表中的张量沿着一个新的维度(这里是第0维,即批量大小维度)堆叠起来
    return torch.stack([corr2d_multi_in(X,k) for k in K],0) # 大k中每个小k是一个3D的Tensor。0表示stack堆叠函数里面在0这个维度堆叠。


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]]])

K = torch.stack((K, K + 1, K + 2), 0)
print(corr2d_multi_in_out(X, K))

输出:
在这里插入图片描述




多个输入和输出通道用途

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




1×1卷积

k h k_h kh= k w k_w kw=1。它不识别空间模式,只是融合通道。相当于输入形状为 n h n_h nh n w n_w nw× c i c_i ci,权重为 c o c_o co× c i c_i ci的全连接层。

在这里插入图片描述

下面,我们使用全连接层实现 1×1 卷积。 请注意,我们需要对输入输出的数据形状进行调整

def corr2d_multi_in_out_1x1(X, K):
	# 获取输入X的形状,其中c_i是输入通道数,h是高度,w是宽度  
    c_i, h, w = X.shape
    # 获取卷积核K的形状,其中c_o是输出通道数
    c_o = K.shape[0]
    # 将二维的图像数据(高度和宽度)平铺成一维  
    X = X.reshape((c_i, h * w))
    # # 将卷积核K的形状保持不变,因为对于1x1卷积,卷积核的形状已经是(c_o, c_i)
    K = K.reshape((c_o, c_i))
    # 全连接层中的矩阵乘法
    Y = torch.matmul(K, X)
    # 将矩阵乘法的结果Y的形状从(c_o, h*w)重塑为(c_o, h, w)  
    # 即将一维的输出数据恢复成二维的图像数据(高度和宽度),同时保持输出通道数c_o  
    return Y.reshape((c_o, h, w))

当执行 1×1 卷积运算时,上述函数相当于先前实现的互相关函数corr2d_multi_in_out。让我们用一些样本数据来验证这一点。

# (3, 3, 3)第一个3是3个通道数,后面两个3是高和宽
X = torch.normal(0, 1, (3, 3, 3))
# (2, 3, 1, 1)第一个参数2是输出,第二个参数是输入通道3,后面两个参数是高和宽,kernel数是1×1
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的卷积层相当于输入形状为c_i × n_hn_w,权重为c_o × c_i的全连接层



该部分总代码

import torch
from d2l import torch as d2l


def corr2d_multi_in(X, K):
    # for使得对最外面通道进行遍历,先遍历“X”和“K”的第0个维度(通道维度)
    # 使用sum 函数来遍历 X 和 K 的通道,并对每个通道对应用 d2l.corr2d 函数进行二维卷积操作,然后将所有通道的结果相加。
    return sum(d2l.corr2d(x, k) for x, k in zip(X, K))


def corr2d_multi_in_out(X, K):
    # 迭代“K”的第0个维度(输出通道),每次都对输入“X”执行互相关运算。
    # 最后将所有结果都叠加在一起
    # torch.stack([...], 0) 将上一步生成的列表中的张量沿着一个新的维度(这里是第0维,即批量大小维度)堆叠起来
    return torch.stack([corr2d_multi_in(X, k) for k in K], 0)  # 大k中每个小k是一个3D的Tensor。0表示stack堆叠函数里面在0这个维度堆叠。


def corr2d_multi_in_out_1x1(X, K):
    # 获取输入X的形状,其中c_i是输入通道数,h是高度,w是宽度
    c_i, h, w = X.shape
    # 获取卷积核K的形状,其中c_o是输出通道数
    c_o = K.shape[0]
    # 将二维的图像数据(高度和宽度)平铺成一维
    X = X.reshape((c_i, h * w))
    # # 将卷积核K的形状保持不变,因为对于1x1卷积,卷积核的形状已经是(c_o, c_i)
    K = K.reshape((c_o, c_i))
    # 全连接层中的矩阵乘法
    Y = torch.matmul(K, X)
    # 将矩阵乘法的结果Y的形状从(c_o, h*w)重塑为(c_o, h, w)
    # 即将一维的输出数据恢复成二维的图像数据(高度和宽度),同时保持输出通道数c_o
    return Y.reshape((c_o, h, w))


# (3, 3, 3)第一个3是3个通道数,后面两个3是高和宽
X = torch.normal(0, 1, (3, 3, 3))
# (2, 3, 1, 1)第一个参数2是输出,第二个参数是输入通道3,后面两个参数是高和宽,kernel数是1×1
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(Y1.shape)
print(Y2.shape)
print(Y1)
print(Y2)
assert float(torch.abs(Y1 - Y2).sum()) < 1e-6
# 意味着1×1的卷积层相当于输入形状为c_i × n_hn_w,权重为c_o × c_i的全连接层
print(float(torch.abs(Y1-Y2).sum()))

输出:

在这里插入图片描述




问题

①网络越深,Padding 0越多,这里是否会影响性能?
    0不会影响性能。


②⭐每个通道的卷积核都不一样吗?不同通道的卷积核大小必须一样吗?
    每个通道的卷积核是不一样的,因为有多少个输出通道就有多少种卷积核。
    不同通道的卷积核是一样的,(这是因为计算上的好处,如果不一样的话得写成两个卷积操作。)即:不同通道的同一个输出通道的卷积核是一样的。

③计算卷积时,bias的有无,对结果影响大吗?bias的作用怎么解释?
    偏移是有一些用的。但没那么大的影响。

④核的参数是学出来的,不是选出来的。

⑤如果是一个RGB图像,加上深度图,相当于输入是四个通道,做卷积是和RGB三通道同样做法吗?
    不是,这地方介绍的二维卷积(只有高宽两个channel),如果加上深度这个维度,就用3D卷积。3D卷积同样有一个输入输出通道。输入就会变成:输入通道×深度×宽×高(4D),核会变成5D的张量,输出同样也是4D.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AWS账号解绑关联】Linker账号解绑重新关联注意事项

文章目录 一、来自客户疑问二、提交工单获取帮助三、最佳操作说明四、最佳操作步骤五、参考资料活动上新 一、来自客户疑问 将Linker账号&#xff0c;从一个组织中退出&#xff0c;重新关联到新的组织中&#xff0c;这解绑到重新完成新的关联绑定期间会在Linker账号中的账单中…

Markdown编写及语法

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Linux 驱动入门(2)—— LED驱动

目录 前言 一、编译替换内核和设备树 二、GPIO子系统 1.引脚编号 2.基于sysfs操作引脚 3.GPIO子系统的函数 三、LED驱动编写 前言 在这里主要记录学习韦东山老师Linux驱动课程的笔记&#xff0c;韦东山老师的驱动课程讲的非常好&#xff0c;想要学习驱动的小伙伴可以去…

mp3转换工具哪个好用?不影响音质的转换器分享

暑假里&#xff0c;#大学生暑期生活日常#总是充满活力&#xff0c;有的同学会选择通过音乐来放松心情&#xff0c;享受生活。 但有时候&#xff0c;我们下载的音乐文件格式并不总是我们想要的&#xff0c;这时候使用mp3格式转换器在线转换音频就是最好的选择。 接下来&#x…

【使用教程】CiA402中的“原点回归模式”和“轮廓位置模式”搭配使用操作实例

使用“原点回归模式”配合“轮廓位置模式”是步进或伺服电机使用过程中最常用的方法&#xff0c;其对于提高自动化生产线的准确性和效率具有重要意义&#xff0c;本文将对正常使用控制电机中发送的命令及顺序进行简要说明。 说明&#xff1a;“原点回归”以“堵转回原点”的方式…

RT-DETR中的CCFF结构代码详解(Pytorch)

代码链接 lyuwenyu/RT-DETR: [CVPR 2024] Official RT-DETR (RTDETR paddle pytorch), Real-Time DEtection TRansformer, DETRs Beat YOLOs on Real-time Object Detection. &#x1f525; &#x1f525; &#x1f525; (github.com)https://github.com/lyuwenyu/RT-DETR 模…

计算机网络408考研 2015

计算机网络408考研2015年真题解析_哔哩哔哩_bilibili 1 1线路编码(NRZ,NRZI,8B/10B,Manchester)与加扰_nrz编码-CSDN博客 1 1 11

sunspec协议储能电能计量装置

电网公司通常要求光伏并网系统为不可逆流发电系统&#xff0c;即光伏并网系统所发的电由本地负荷消耗&#xff0c;多余的电不允许通过低压配电变压器向上级电网逆向送电。在并网发电系统中&#xff0c;由于外部环境是不断变化的&#xff0c;为了防止光伏并网系统逆向发电&#…

DLL修复工具免费版本推荐:有效修复DLL文件问题

在Windows系统中&#xff0c;DLL&#xff08;动态链接库&#xff09;文件扮演着至关重要的角色。它们为多个程序共享代码和资源&#xff0c;节省内存并促进程序之间的高效运行。然而&#xff0c;DLL文件的损坏或丢失可能导致各种问题&#xff0c;如程序崩溃、系统不稳定甚至蓝屏…

大数据技术——实战项目:广告数仓(第五部分)

目录 第9章 广告数仓DIM层 9.1 广告信息维度表 9.2 平台信息维度表 9.3 数据装载脚本 第10章 广告数仓DWD层 10.1 广告事件事实表 10.1.1 建表语句 10.1.2 数据装载 10.1.2.1 初步解析日志 10.1.2.2 解析IP和UA 10.1.2.3 标注无效流量 10.2 数据装载脚本 第9章 广…

Ubuntu中设置环境变量 PATH 的命令,不生效的问题“PATH=~/bin:$PATH”

1. 知识点 PATH~/bin:$PATH PATH&#xff1a;这是一个环境变量&#xff0c;用于指定操作系统在哪些目录中查找可执行文件。 ~&#xff1a;这是一个特殊的符号&#xff0c;代表当前用户的主目录。 /bin&#xff1a;这通常是存放标准实用程序&#xff08;如 ls, cp 等&#xff…

解决Openwrt 串口默认是没有密码的方法

将串口登录加入密码方法如下&#xff1a; 步骤一&#xff1a;配置busybox的登录&#xff0c;可以在.config文件中添加如下 CONFIG_BUSYBOX_CONFIG_LOGINy 添加后&#xff0c;需要重新编译busybox。 步骤二&#xff1a;修改target/linux/ramips/base-files/etc/inittab文件 将…

C++之类与对象(中)(上篇)

类与对象&#xff08;中&#xff09; 类的默认成员函数 默认成员函数就是⽤⼾没有显式实现&#xff0c;编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类&#xff0c;我 们不写的情况下编译器会默认⽣成以下6个默认成员函数&#xff0c;需要注意的是这6个中最重要的是前4…

ECCV 2024 | 南洋理工三维数字人生成新范式:结构扩散模型

该论文作者均来自于新加坡南洋理工大学 S-Lab 团队&#xff0c;包括博士后胡涛&#xff0c;博士生洪方舟&#xff0c;以及计算与数据学院刘子纬教授&#xff08;《麻省理工科技评论》亚太地区 35 岁以下创新者&#xff09;。S-Lab 近年来在顶级会议如 CVPR, ICCV, ECCV, NeurIP…

ICE.AI战略扩展亚太市场,创新交易模式及平台全面升级

2024年8月11日,纽约——全球金融科技领军企业,Intercontinental Exchange Inc.宣布,公司将加速在亚太市场的战略扩展,并通过进一步优化交易模式和平台功能,巩固其在全球市场的卓越地位,同时积极探索新的获利机会。 ICE.AI自推行以来,凭借前沿的人工智能技术和深度学习算法,为全…

shell编程:利用SSH实现分布式应用的一键安装部署②(脚本安装java环境、脚本安装配置zookeeper、scala、kafka)

上一节&#xff1a;函数封装 ②脚本安装java环境、脚本安装配置zookeeper、scala、kafka 1 脚本一键部署kafka分布式应用 1.1 脚本安装配置java环境 准备好java安装包&#xff0c;存放到/opt/tmp目录下。我这里使用的是jdk-8u212-linux-x64.tar.gz&#xff0c;在网上找对应…

excel向下合并空值

方方格子&#xff1a;合并转换——合并空值 选择向右或者向下

基于ssm+vue+uniapp的英语学习交流平台小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

【网络】套接字(socket)编程——UDP版

1.socket 1.1.什么是socket Socket 的中文翻译过来就是“套接字”。 套接字是什么&#xff0c;我们先来看看它的英文含义&#xff1a;插座。 Socket 就像一个电话插座&#xff0c;负责连通两端的电话&#xff0c;进行点对点通信&#xff0c;让电话可以进行通信&#xff0c;端…

鸿蒙(API 12 Beta3版)【音视频解封装】 文件解析封装

开发者可以调用本模块的Native API接口&#xff0c;完成音视频解封装&#xff0c;即从比特流数据中取出音频、视频等媒体帧数据。 当前支持的数据输入类型有&#xff1a;远程连接(http协议、HLS协议)和文件描述符(fd)。 支持的解封装格式如下&#xff1a; 媒体格式封装格式码…