机器学习-卷积神经网络CNN中的单通道和多通道图片差异
背景
最近在使用CNN的场景中,既有单通道的图片输入需求,也有多通道的图片输入需求,因此又整理回顾了一下单通道或者多通道卷积的差别,这里记录一下探索过程。
结论
直接给出结论,单通道图片和多通道图片在经历了第一个卷积层以后,就没有单通道或者多通道的区别了,剩下的网络可以采取完全一样的结构。这也为我们使用各种各样的网络架构,resnet,Alexnet,vgg提供了方便,因为他们都是为了跑ImageNet而设计的特定输入。
图解
1.成员介绍

在CNN中涉及到的主要就是image kernel bias这三个元素。这里image表示是首层的输入,后边卷积层的impute都是前边的output,与首层操作类似,不再多说。
2.单通道图片卷积过程

可以看到,通过对应位置相乘再相加,结合bias,最终得到feature map中的一个元素,所以卷积核的一次计算只得到一个数。当卷积核刷遍整张图片以后,得到了一个完整的feature map。这个东西将作为下一层的输入,传递下去。
通常来说,我们的卷积层不会只有一个kernel,因为一个kernel只能提取图片的一类特征,我们使用CNN的目的就在于应用多个kernel学习到多个特征,下面给出使用两个kernel的例子。

每一个kernel都会来一遍上图中获得feature map的过程。最终我们会得到2个feature map,与卷积核的数量一致。
2.RGB三通道图片卷积过程

这里可以看到,图片从一个矩阵变为了3个,这时候kernel也变成了3个矩阵,请注意 ,这三个叫做一个kernel,但是这三个kernel共享一个bias。在卷积运算的时候,这个kernel的三个通道分别与对应的图片通道做卷积,过程与单通道处理是一样的,但是这里由于有三个通道,所以会得到3个数字,而不是之前的一个数字,但是这里的三个数字会直接相加,最终还是一个数字,所以这里就是3通道卷积的trick所在,这里是容易疑惑的一个点,搞明白就好。

多个kernel可以类比之前的单通道,总之,结论就是,不管是单通道还是三通道的首个卷积层,都会输出与kernel数量相等的feature map。且不管是不是单通道,只要图片宽高是一样的,单通道和多通道的首个卷积层过后,得到的feature map在维度上是一致的。
代码验证
选择了pytorch中的torch.nn.Conv2d来做验证。
1.简单介绍网络的输入参数含义
import torch.nn as nn# 定义一个二维卷积层
conv_layer = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1)# 假设有一个4维的输入张量 x,形状为 (batch_size, in_channels, height, width)
x = torch.randn(1, 3, 32, 32)# 在输入张量上应用卷积层
output = conv_layer(x)# 输出张量的形状为 (batch_size, out_channels, output_height, output_width)
其中,in_channels表示输入张量的通道数,out_channels表示输出张量的通道数(即卷积核的数量),kernel_size表示卷积核的大小,stride表示卷积的步长,padding表示边缘填充的大小。在输入张量上应用卷积层后,输出张量的形状为 (batch_size, out_channels, output_height, output_width)。
2.为单通道图片设计第一个卷积层,并查看该层的输出
# 设计一个单通道的卷积网络结构
import torch
from torch.autograd import Variable
# 单通道图片模拟输入
input=torch.ones(1,1,64,64)
input=Variable(input)
x=torch.nn.Conv2d(in_channels=1,out_channels=5,kernel_size=3,groups=1)
out=x(input)
print(out.shape)
print(list(x.parameters()))
打印结果
torch.Size([1, 5, 62, 62])
[Parameter containing:
tensor([[[[-0.1166, 0.2381, -0.0446],[ 0.0855, 0.1347, -0.2986],[-0.3251, 0.2721, 0.2473]]],[[[-0.1630, 0.2612, 0.1867],[-0.1606, -0.2781, -0.1183],[ 0.2221, -0.1114, -0.2046]]],[[[-0.2414, -0.2379, 0.0680],[ 0.1928, -0.0585, 0.1804],[ 0.1891, -0.1915, 0.0281]]],[[[-0.3227, 0.0911, -0.0136],[-0.2742, -0.2246, -0.1227],[ 0.1420, 0.3284, -0.0288]]],[[[ 0.2173, -0.1299, -0.2056],[-0.2324, 0.2499, -0.1909],[ 0.2416, -0.1457, -0.1176]]]], requires_grad=True),
Parameter containing:
tensor([-0.0273, 0.2994, 0.3226, -0.2969, 0.2965], requires_grad=True)]
这里我们可以看到,第一层的输出结果是有5个feature maps,也就是卷积核的数量。随后我们打印出了第一层的卷积参数,可以看到就是5个卷积核的参数,以及对应的五个bias参数。
3.为RGB三通道图片设计第一个卷积层,并给出参数
# 设计一个3通道的卷积网络结构
import torch
from torch.autograd import Variable
# 模拟RGB三通道图片输入
input=torch.ones(1,3,64,64)
input=Variable(input)
x=torch.nn.Conv2d(in_channels=3,out_channels=5,kernel_size=3,groups=1)
out=x(input)
print(out.shape)
print(list(x.parameters()))
打印输出
torch.Size([1, 5, 62, 62])
[Parameter containing:
tensor([[[[-0.0902, -0.0764, 0.1497],[-0.0632, -0.1014, -0.0682],[ 0.1309, 0.1173, 0.0268]],[[-0.0410, -0.1763, 0.0867],[ 0.0771, -0.0969, 0.0700],[ 0.1446, -0.0159, -0.1869]],[[-0.1278, 0.0244, 0.1861],[-0.0180, 0.0529, -0.1475],[-0.0562, -0.0487, 0.0659]]],[[[ 0.0649, -0.1758, -0.0420],[ 0.1287, 0.1500, 0.1027],[ 0.0033, 0.1565, 0.1461]],[[ 0.0645, 0.0515, -0.0729],[ 0.0900, 0.0941, 0.1813],[ 0.1846, -0.1075, 0.1861]],[[ 0.1489, 0.0536, 0.1510],[-0.1070, 0.0748, 0.1619],[ 0.1812, -0.0722, 0.1492]]],[[[-0.0450, -0.0846, 0.0761],[ 0.1049, 0.0492, 0.1556],[ 0.1301, 0.0494, 0.0136]],[[-0.1303, -0.0979, -0.0331],[ 0.0435, -0.0201, -0.1207],[ 0.1275, -0.0049, -0.0092]],[[ 0.1782, 0.1347, 0.0707],[-0.0850, 0.0585, 0.1361],[ 0.0917, -0.0156, 0.0407]]],[[[ 0.0491, 0.0752, 0.0096],[ 0.1599, -0.1281, -0.0937],[ 0.1029, -0.1467, 0.1238]],[[-0.0651, -0.1169, 0.1772],[ 0.0180, 0.1491, 0.0145],[ 0.0586, 0.1246, 0.1060]],[[-0.1220, 0.0525, 0.1046],[ 0.0069, 0.0356, 0.0152],[-0.0822, -0.1157, -0.0420]]],[[[-0.0679, 0.1752, 0.1020],[ 0.0018, 0.0721, 0.1708],[-0.0201, 0.1753, 0.0620]],[[-0.0023, -0.1203, -0.1113],[ 0.1765, -0.1914, 0.0836],[-0.0526, -0.1803, -0.0656]],[[-0.1735, 0.0795, -0.1867],[ 0.1757, -0.0261, 0.0198],[-0.1756, -0.0549, -0.0018]]]], requires_grad=True),
Parameter containing:
tensor([-0.1727, 0.1823, 0.1416, -0.0721, -0.1219], requires_grad=True)]
可以看到,对三通道的图片处理后,输出的也是一样的形状,但是具体再看卷积核,会发现,每个卷积核都有3个通道,而且每个通道的参数是不一样的,但是他们共享一个bias。
相关文章:
机器学习-卷积神经网络CNN中的单通道和多通道图片差异
背景 最近在使用CNN的场景中,既有单通道的图片输入需求,也有多通道的图片输入需求,因此又整理回顾了一下单通道或者多通道卷积的差别,这里记录一下探索过程。 结论 直接给出结论,单通道图片和多通道图片在经历了第一…...
考研复试——计算机组成原理
文章目录计算机组成原理1. 计算机系统由哪两部分组成?计算机系统性能取决于什么?2. 冯诺依曼机的主要特点?3. 主存储器由什么组成,各部分有什么作用?4. 什么是存储单元、存储字、存储字长、存储体?5. 计算机…...
硬件设计 之摄像头分类(IR摄像头、mono摄像头、RGB摄像头、RGB-D摄像头、鱼眼摄像头)
总结一下在机器人上常用的几种摄像头,最近在组装机器人时,傻傻分不清摄像头的种类。由于本人知识有限,以下资料都是在网上搜索而来,按照摄像头的分类整理一下,供大家参考: 1.IR摄像头: IRinfr…...
PTA:C课程设计(2)
山东大学(威海)2022级大一下C习题集(2)2-5-1 字符定位函数(程序填空题)2-5-2 判断回文(程序填空题)2-6-1 数字金字塔(函数)2-6-2 使用函数求最大公约数(函数)2-6-3 使用函数求余弦函…...
第四章:面向对象编程
第四章:面向对象编程 4.1:面向过程与面向对象 面向过程(POP)与面向对象(OOP) 二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象&…...
Linux 安装npm yarn pnpm 命令
下载安装包 node 下载地址解压压缩包 tar -Jxf node-v19.7.0-linux-x64.tar.xz -C /root/app echo "export PATH$PATH:/app/node-v16.9.0-linux-x64" >> /etc/profile source /etc/profile ln -sf /app/node-v16.9.0-linux-x64/bin/npm /usr/local/bin/ ln -…...
linux SPI驱动代码追踪
一、Linux SPI 框架概述 linux系统下的spi驱动程序从逻辑上可以分为3个部分: SPI Core:SPI Core 是 Linux 内核用来维护和管理 spi 的核心部分,SPI Core 提供操作接口,允许一个 spi master,spi driver 和 spi device 在 SPI Cor…...
Ls-dyna材料的相关学习笔记
Elastic Linear elastic materials -Isotropic:各向同性材料 -orthotropic 正交各向异性的 -anistropic 各向异性的...
Arrays方法(copyOfRange,fill)
Arrays方法 1、Arrays.copyOfRange Arrays.copyOfRange的使用方法 功能: 将数组拷贝至另外一个数组 参数: original:第一个参数为要拷贝的数组对象 from:第二个参数为拷贝的开始位置(包含) to:…...
AcWing - 蓝桥杯集训每日一题(DAY 1——DAY 5)
文章目录一、AcWing 3956. 截断数组(中等)1. 实现思路2. 实现代码二、AcWing 3729. 改变数组元素(中等)1. 实现思路2. 实现代码三、AcWing 1460. 我在哪?(简单)1. 实现思路2. 实现代码四、AcWin…...
RHCSA-文件的其他命令(3.7)
目录 文件的其他命令: 文本内容统计wc 移动和复制(cp) 移动 查找文件的路径 压缩和解压缩 .tar(归档命令) shell-命令解释器 linux中的特殊字符 查看系统上的别名:alias 历史命令(his…...
多线程update导致的mysql死锁问题处理方法
最近想起之前处理过的一个mysql 死锁问题,是在高并发下update批量更新导致的,这里探讨一下发生的原因,以及解决办法; 发生死锁的sql语句如下,其中where条件后的字段是有复合索引的。 update t_push_message_device_h…...
SpringBoot 如何保证接口安全?
为什么要保证接口安全对于互联网来说,只要你系统的接口暴露在外网,就避免不了接口安全问题。 如果你的接口在外网裸奔,只要让黑客知道接口的地址和参数就可以调用,那简直就是灾难。举个例子:你的网站用户注册的时候&am…...
英伟达驱动爆雷?CPU占用率过高怎么办?
又有一新驱动导致CPU占用率过高? 上周英伟达发布531.18显卡驱动,为大家带来了视频超分辨率技术,并为新发布的热门游戏《原子之心》提供支持。 但在安装新驱动后没过不久就有玩家反映,在游戏结束后会出现CPU占用率突然飙升到10%以…...
链表经典面试题【典中典】
💯💯💯链表经典面试题❗❗❗炒鸡经典,本篇带有图文解析,建议动手刷几遍。🟥1.反转链表🟧2.合并两个有序链表🟨3.链表分割🟩4.链表的回文结构🟦5.相交链表&…...
Java泛型深入
一. 泛型的概述和优势 泛型概述 泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。泛型的格式:<数据类型>,注意:泛型只能支持引用数据类型。集合体系的全部接口和实现类都是…...
体验Linux USB 驱动
目录 一、USB OTG 二、I.MX6ULL USB 接口简介 硬件原理图 1、USB HUB 原理图 2 、USB OTG 原理图 三、使能驱动 1、打开 HID 驱动 2、 使能 USB 键盘和鼠标驱动 3 、使能 Linux 内核中的 SCSI 协议 4、使能 U 盘驱动 四、测试u盘 五、 Linux 内核自带 USB OTG USB 是…...
servlet 中的ServletConfig与servletContext
ServletConfig对象:servlet配置对象,主要把servlet的初始化参数封装到这个对象中。 一个网站中可能会存在多个servletConfig对象,一个servletConfig对象就封装了一个servlet的配置信息。 可以在web.xml中通过<init-param></init-p…...
Hadoop3.1.3单机(伪分布式配置)
参考:林子雨老师网站博客 Hadoop安装搭建伪分布式教程(全面)吐血整理 环境 Vmare12 Ubuntu16.04 创建Hadoop用户 若安装Ubuntu不是用的“hadoop”用户,则需要增加一个名为"hadoop"的用户 直接快捷键ctrlaltt或者点…...
HBase---浅谈HBase原理
浅谈HBase原理 文章目录浅谈HBase原理HBase定义HBase逻辑结构HBase物理存储结构TimeStampType数据模型NaneSpaceRegionRowColumnTineStampCellHBase架构MasterMaster 架构Meta 表格介绍Region ServerRegionServer 架构MemStoreWALBlockCacheZookeeperHDFSHBase写数据流程HBase读…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
