从0开始深度学习(25)——多输入多输出通道

之前我们都只研究了一个通道的情况(二值图、灰度图),但实际情况中很多是彩色图像,即有标准的RGB三通道图片,本节将更深入地研究具有多输入和多输出通道的卷积核。

1 多输入通道

当输入包含多个通道时,需要构造一个与输入数据具有相同输入通道数的卷积核,以便与输入数据进行互相关运算。

当有多个通道时,我们可以对每个通道输入的二维张量和卷积核的二维张量进行互相关运算,再对通道求和得到二维张量,如下图所示:

在这里插入图片描述
下面是通过代码实现:

import torch
from d2l import torch as d2ldef corr2d_multi_in(X, K):# 先遍历“X”和“K”的第0个维度(通道维度),再把它们加在一起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]]])X = X.unsqueeze(0)  # 增加一个维度,形状变为 (1, 2, 3, 3)               
K = K.unsqueeze(0)  # 增加一个维度,形状变为 (1, 2, 2, 2)conv2d = nn.Conv2d(in_channels=2, out_channels=1, kernel_size=2, bias=False)
conv2d.weight.data =K
# 执行卷积操作
Y = conv2d(X)# 输出卷积结果的形状
print("Output shape:", Y.shape)# 如果需要查看具体的卷积结果,可以打印出来
print("Output tensor:")
print(Y)

运行结果
在这里插入图片描述

2 多输出通道

到目前为止,我们还只有一个输出通道。在最流行的神经网络架构中,随着神经网络层数的加深,我们常会增加输出通道的维数,通过减少空间分辨率以获得更大的通道深度。直观地说,我们可以将每个通道看作对不同特征的响应。
在这里插入图片描述
代码如下:

import torch
from d2l import torch as d2ldef corr2d_multi_in(X, K):# 先遍历“X”和“K”的第0个维度(通道维度),再把它们加在一起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]]],  # K[[[1.0, 2.0], [3.0, 4.0]], [[2.0, 3.0], [4.0, 5.0]]],  # K + 1[[[2.0, 3.0], [4.0, 5.0]], [[3.0, 4.0], [5.0, 6.0]]]   # K + 2
])X = X.unsqueeze(0)  # 增加一个维度,形状变为 (1, 2, 3, 3)               conv2d = nn.Conv2d(in_channels=2, out_channels=2, kernel_size=2, bias=False)
conv2d.weight.data =K
# 执行卷积操作
Y = conv2d(X)# 输出卷积核的形状,第一个是参数输出通道,第二个参数是输入通道,后面两个是卷积的高度和宽度
print("kernle shape:", K.shape)# 如果需要查看具体的卷积结果,可以打印出来
print("Output tensor:")
print(Y)

运行结果
在这里插入图片描述

3 1 × \times × 1 卷积核

1 × 1 1\times1 1×1的卷积核看似没有作用,实则可以起到一些对输入图像的通道进行一些操作

3.1 通道变换

使用 1x1 卷积核将通道数从 64 变为 128。

import torch
from torch import nn# 输入特征图形状为 (1, 64, 28, 28)
x = torch.randn(1, 64, 28, 28)# 使用 1x1 卷积核将通道数从 64 变为 128
conv1x1 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=1)# 执行卷积操作
y = conv1x1(x)# 输出形状为 (1, 128, 28, 28)
print(y.shape)  # torch.Size([1, 128, 28, 28])

3.2 特征融合

1x1 卷积核可以用来融合不同通道的特征,使用 1x1 卷积核将通道数从 32 变为 16。

# 输入特征图形状为 (1, 32, 32, 32)
x = torch.randn(1, 32, 32, 32)# 使用 1x1 卷积核将通道数从 32 变为 16
conv1x1 = nn.Conv2d(in_channels=32, out_channels=16, kernel_size=1)# 执行卷积操作
y = conv1x1(x)# 输出形状为 (1, 16, 32, 32)
print(y.shape)  # torch.Size([1, 16, 32, 32])

3.3 提升计算效率

使得 1x1 卷积核在深度网络中可以高效地减少参数数量和计算成本,假设我们有一个大通道数的特征图,使用 1x1 卷积核可以显著减少后续层的计算负担,最后在进行升维。

# 输入特征图形状为 (1, 256, 14, 14)
x = torch.randn(1, 256, 14, 14)# 使用 1x1 卷积核将通道数从 256 减少到 64
conv1x1_reduce = nn.Conv2d(in_channels=256, out_channels=64, kernel_size=1)
x = conv1x1_reduce(x)# 应用 3x3 卷积核
conv3x3 = nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, padding=1)
x = conv3x3(x)# 使用 1x1 卷积核将通道数从 64 恢复到 256
conv1x1_expand = nn.Conv2d(in_channels=64, out_channels=256, kernel_size=1)
x = conv1x1_expand(x)# 输出形状为 (1, 256, 14, 14)
print(x.shape)  # torch.Size([1, 256, 14, 14])

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++笔记】C++三大特性之继承

【C笔记】C三大特性之继承 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】C三大特性之继承前言一.继承的概念及定义1.1 继承的概念1.2继承的定义1.3继承基类成员访问方式的变化1.4继承类模板 二.基类和派生类间的转…

【Unity】Game Framework框架学习使用

前言 之前用过一段时间的Game Framework框架,后来有那么一段时间都做定制小软件,框架就没再怎么使用了。 现在要做大型项目了,感觉还是用框架好一些。于是又把Game Framework拾起来了。 这篇文章主要是讲Game Framework这个框架是怎么用的…

Ubuntu 22 安装 Apache Doris 3.0.3 笔记

Ubuntu 22 安装 Apache Doris 3.0.3 笔记 1. 环境准备 Doris 需要 Java 17 作为运行环境,所以首先需要安装 Java 17。 sudo apt-get install openjdk-17-jdk -y sudo update-alternatives --config java在安装 Java 17 后,可以通过 sudo update-alter…

【Web前端】从回调到现代Promise与Async/Await

异步编程是一种让程序能够在等待某些操作完成的同时继续执行其他任务的关键技术,打破了传统编程中顺序执行代码的束缚。这种编程范式允许开发者构建出能够即时响应用户操作、高效处理网络请求和资源加载的应用程序。通过异步编程,JavaScript 能够在执行耗…

文心一言 VS 讯飞星火 VS chatgpt (388)-- 算法导论24.5 8题

八、设 G ( V , E ) G(V,E) G(V,E) 为一个带权重的有向图,且包含一个可以从源结点 s s s 到达的权重为负值的环路。请说明如何构造一个 G G G 的边的松弛操作的无限序列,使得每一步松弛操作都能对某一个最短路径估计值进行更新。如果要写代码&#x…

uni-app资源管理与图标使用全解

uni-app 框架与资源路径 不需要专门去学习小程序的语法,uni-app使用的是vue的语法,不是小程序自定义的语法。 搜索框:有疑问直接搜索框输入,BUG直接复制错误提示粘贴上去搜索。 介绍:先看这个页面,就知道u…

大数据新视界 -- 大数据大厂之 Impala 性能优化:数据加载策略如何决定分析速度(上)(15/30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Java:JVM

1.JVM内存区域的划分 一个Java写的程序跑起来,就得到了一个Java进程 JVM 上面运行的字节码指令; 进程:操作系统资源分配的基本单位; 内存区域的划分: 1.程序计数器 在内存空间里(比较小的空间),保存了下一个要执行的指令的内存地址(元数据区的地址); 这里的"下一条…

阿里公告:停止 EasyExcel 更新与维护

最近,阿里发布公告通知,将停止对知名 Java Excel 工具库 EasyExcel 的更新和维护。EasyExcel 由阿里巴巴开源,作者是玉箫,在 GitHub 上拥有 30k stars、7.5k forks 的高人气。 据悉,EasyExcel 作者玉箫去年已从阿里离…

安卓智能对讲终端|北斗有源终端|三防对讲机|单兵终端|单北斗

在当今快速发展的通信技术时代,智能对讲手持机已成为众多行业领域中不可或缺的通讯工具。QM240T安卓智能对讲手持机,作为一款集先进技术与实用功能于一身的高端设备,凭借其卓越的性能和多样化的应用特性,正逐步引领对讲机市场的革…

5G智能对讲终端|北斗有源终端|北斗手持机|单兵|单北斗

在当今这个快速发展的数字化时代,5G技术的广泛应用正以前所未有的速度推动着各行各业的变革。作为这一技术浪潮中的重要一环,5G智能终端QM630D凭借其卓越的性能和多样化的功能,在林业、渔业、安保、电力、交通等多个领域展现出了巨大的应用潜…

【计网】数据链路层笔记

【计网】数据链路层 数据链路层概述 数据链路层在网络体系结构中所处的地位 链路、数据链路和帧 链路(Link)是指从一个节点到相邻节点的一段物理线路(有线或无线),而中间没有任何其他的交换节点。 数据链路(Data Link)是基于链路的。当在一条链路上传送数据时&a…

重学SpringBoot3-整合 Elasticsearch 8.x (二)使用Repository

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 整合 Elasticsearch 8.x (二)使用Repository 1. 环境准备1.1 项目依赖1.2 Elasticsearch 配置 2. 使用Repository的基本步骤2.1 创建实体类2.2 创…

计算机课程管理:Spring Boot与工程认证的协同创新

3系统分析 3.1可行性分析 通过对本基于工程教育认证的计算机课程管理平台实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本基于工程教育认证的计算机课程管理平…

<项目代码>YOLOv8 苹果腐烂识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

游戏引擎学习第四天

视频参考:https://www.bilibili.com/video/BV1aDmqYnEnc/ BitBlt 是 Windows GDI(图形设备接口)中的一个函数,用于在设备上下文(device context, DC)之间复制位图数据。BitBlt 的主要用途是将一个图像区域从一个地方复…

SPIRE: Semantic Prompt-Driven Image Restoration 论文阅读笔记

这是一篇港科大学生在google research 实习期间发在ECCV2024的语义引导生成式修复的文章,港科大陈启峰也挂了名字。从首页图看效果确实很惊艳,尤其是第三行能用文本调控修复结果牌上的字。不过看起来更倾向于生成,对原图内容并不是很复原&…

如何平滑切换Containerd数据目录

如何平滑切换Containerd数据目录 大家好,我是秋意零。 这是工作中遇到的一个问题。搭建的服务平台,在使用的过程中频繁出现镜像本地拉取不到问题(在项目群聊中老是被人出来😅)原因是由于/目录空间不足导致&#xff0…

Sharding运行模式、元数据、持久化详解

运行模式 单机模式 能够将数据源和规则等元数据信息持久化,但无法将元数据同步至多个Sharding实例,无法在集群环境中相互感知。 通过某一实例更新元数据之后,会导致其他实例由于获取不到最新的元数据而产生不一致的错误。 适用于工程师在本…

基于springboot+小程序的鲜花管理系统(鲜花1)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 本网上花店微信小程序分为管理员还有用户两个权限,管理员可以管理用户的基本信息内容,可以管理公告信息以及鲜花信息,能够与用户进行相互交流等操作&am…