机器学习-卷积神经网络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。

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

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

相关文章

【hello C语言】结构体(下)

目录 1.结构体的声明 1.1 结构的声明 1.2 特殊声明:匿名结构体 1.3 结构的自引用 2. 结构体的定义和初始化 3. 结构体的内存对齐 3.1 内存对齐规则 3.2 内存对齐存在的原因 3.3 修改默认对其数 4. 结构体传参 C语言🛴 1.结构体的声明 结构体便是描述复杂…

一种适合容器化部署的雪花算法ID生成器

雪花算法简介 SnowFlake 中文意思为雪花,故称为雪花算法。最早是 Twitter 公司在其内部用于分布式环境下生成唯一 ID。 雪花算法有以下几个优点: 高并发分布式环境下生成不重复 id,每秒可生成百万个不重复 id。基于时间戳,以及同…

零编程经验,通过 GPT-4 十分钟开发了一个浏览器插件,并成功运行,实现了需求目标!

大佬蓝鸟ID: sundyme零编程经验,通过 GPT-4 十分钟开发了一个浏览器插件,并成功运行,实现了需求目标!太不可思意了,真正体会到了自然语言编程的魅力! 下一步是利用Pinterest 的 API 接口实现自动发图&#…

No.026<软考>《(高项)备考大全》【第10章】项目沟通和干系人管理(第2部分-干系人管理)

1 干系人管理部分相关 1.1 干系人ITO 1.2 干系人管理 过程过程的定义过程的作用识别干系人识别能影响项目决策、活动或结果的个人、群体或组织,以及被项目决策、活动或者结果影响的个人、群体或者组织,并分析和记录他们的相关信息的过程帮助项目经理建…

此战成硕,我成功上岸西南交通大学了~~~

友友们,好久不见,很长时间没有更一个正式点的文章了! 是因为我在去年年底忙着准备初试,今年年初在准备复试,直到3月底拟录取后,终于可以写下这篇上岸贴,和大家分享一下考研至上岸的一个过程 文章…

游戏算法-游戏AI行为树,python实现

参考文章:Behavior trees for AI: How they work (gamedeveloper.com) 本文主要参考上述weizProject Zomboid 的开发者 Chris Simpson文章的概念,用伪代码实现代码例子 AI概述 游戏AI是对游戏内所有非玩家控制角色的行为进行研究和设计,使得游…

电子拣货标签9代系统简介

CK_Label_v9一、产品参数 产品型号 CK_Label_v9 LED 3(红&黄&绿)独立可控 供电方式 DC 24V 0.2A 通信方式 无线通信 蜂鸣器 支持 尺寸 D60 H307mm 二、革新点 配合标签拣货使用三个灯(红黄绿)都可以被独立控…

基于MATALB编程的BP神经网络手臂血管分类识别,基于BP神经网络的图像分类

目标 背影 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 数据 神经网络参数 基于BP神经网络手臂血管识别的MATLAB代码 效果图 结果分析 展望 背影 随着人工智能的发展,智…

贪心算法-删数问题C++

目录 一、题目 二&#xff1a;思路 代码 运行结果 一、题目 有一个长度为n&#xff08;n < 240&#xff09;的正整数&#xff0c;从中取出k&#xff08;k < n&#xff09;个数&#xff0c;使剩余的数保持原来的次序不变&#xff0c;求这个正整数经过删数之后最小是多…

用Python绘制六种可视化图表,简直太好用了

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python资料、源码、教程: 点击此处跳转文末名片获取 可视化图表&#xff0c;有相当多种&#xff0c;但常见的也就下面几种&#xff0c;其他比较复杂一点&#xff0c;大都也是基于如下几种进行组合&#xff0c;变换出来的。 …

记录--CSS 如何实现羽化效果?

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 最近碰到这样一个问题&#xff0c;在一张封面上直接显示书名&#xff0c;可能会存在书名看不太清楚的情况(容易受到背景干扰)&#xff0c;如下 为了解决这个问题&#xff0c;设计师提了一个“究极”方…

算法 - 希尔排序

原理 首先将数组两两分组&#xff0c;分成n组数组&#xff0c;每组数组内部进行排序。再分成n/2组数组&#xff0c;每组数组内部进行排序。直至分成只剩一组&#xff0c;最后进行排序得到最后的数组。 代码 public static int[] shell(int[] arr) {int temp;for (int gra …

计算机图形学13:三维图形的几何变换

作者&#xff1a;非妃是公主 专栏&#xff1a;《计算机图形学》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、三维图形的几…

MongoDB综述【入门指南】

写这篇博客,正好是2023年4月5日15:29:31,是清明节,放假一天,我坐在我的小小租房室内,思考着没思考到啥,哈哈哈,感觉好着急啊!看完了一本《城南旧事》,但是就是不踏实,好吧~我来写一篇最近在学的一个技术 为了更优秀的自己~奥利给!! 首先,我们从最初级小白开始(因为自己也是小白…

卷麻了,00后测试用例写的比我还好,简直无地自容.....

前言 作为一个测试新人&#xff0c;刚开始接触测试&#xff0c;对于怎么写测试用例很头疼&#xff0c;无法接触需求&#xff0c;只能根据站在用户的角度去做测试&#xff0c;但是这样情况会导致不能全方位的测试APP&#xff0c;这种情况就需要一份测试用例了&#xff0c;但是不…

倾斜实景三维建模与BIM模型处理技术

倾斜实景三维建模与BIM模型处理技术 一、研究背景 ➢ 倾斜模型 ✓ 真实纹理&#xff0c;高分辨率 ✓ 真实坐标&#xff0c;高空间精度 ✓ 快速建模&#xff0c;低建模成本 ➢ BIM设计 BIM 技术作为建筑施工行业中的新技术&#xff0c;存在于建筑的全生命周期&#xff0c;服务…

机器学习算法:K近邻(k-nearest neighbors)初探

KNN的介绍和应用 KNN&#xff08;K-Nearest Neighbor&#xff09;算法是一种基于实例的学习算法&#xff0c;也是一种常见的分类算法。 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别&#xff0c;则该样本也属于这个类别。 示例 &…

Python 3 基本数据类型,包含示例演示(初学友好)

嗨害大家好鸭~ 我是芝士❤ 有好好学习python吗&#xff1f; Python学习资料电子书 点击此处跳转文末名片获取 Python3 基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。 在 Python 中&#xff0c;变量就是变量…

MATLAB 求解定积分和不定积分

本文主要介绍如何通过matlab 去求解常见的定积分和不定积分的结果&#xff0c;使用matlab 内置函数 int。 语法&#xff1a; Fint(表达式&#xff0c;变量&#xff0c;变量上下限) 目录 例子1 单变量不定积分 例子2 多变量不定积分 例子3 单变量定积分 例子4 定积分近似求…

软件测试高频出现面试题-2(实用)

每日面试1、自我介绍2、简单介绍最近项目你是如何开展测试工作的呢&#xff1f;3、描述在这个项目里面你主要负责哪些模块的测试&#xff1f;选中一个业务复杂的讲述你是如何测试的呢&#xff1f;1、自我介绍 主要可以从三个方面准备&#xff1a;我的基础信息&#xff0c;我的…