常用组件详解(一):nn.Conv2d、nn.functional.conv2d()

news2024/10/7 4:29:56

文章目录

  • 一、torch.nn.Conv2d基本介绍
    • 1.1构造方法
    • 1.2参数、偏置、属性
      • 1.2.1参数与偏置
      • 1.2.2可查看属性
    • 1.3torch.nn.functional.conv2d
    • 1.4dilation
  • 二、卷积操作
    • 2.1in_channels=1, out_channels=1, kernel_size=3, stride=1, padding=0
    • 2.2in_channels=1, out_channels=1, kernel_size=3, stride=2, padding=1
    • 2.3in_channels=2, out_channels=3, kernel_size=3, stride=1, padding=0
    • 2.4设置padding使特征图与原图像大小相等
    • 2.5分组卷积


  注意以下区别:

  • torch.nn.Conv2d:构造卷积层的类,用于创建卷积层对象。这是一个模型组件,它具有可学习的参数(如权重和偏置),并且在模型训练过程中会通过反向传播更新这些参数。
  • nn.functional.conv2d():执行卷积操作的函数,它直接进行卷积计算。这个函数没有可学习的参数,因此在模型训练过程中不能通过反向传播来调整它的参数。

在构建深度学习模型时会使用nn.Conv2d而非nn.conv2d,在定义模型结构时,Conv2d 通常作为卷积层的组件使用(它有可学习的参数,且会通过反向传播更新),而在模型的前向传播过程中会使用conv2d函数来执行具体的卷积操作。

一、torch.nn.Conv2d基本介绍

  torch.nn.Conv2d类对象常常用于作为卷积层以构造神经网络模型,官方文档地址为:点击跳转。torch.nn.Conv2d类对象以 ( N , C i n , H , W ) (N,C_{in} ,H,W) (NCinHW)作为输入数据,以 ( N , C o u t , H o u t , W o u t ) (N,C_{out} ,H_{out},W_{out}) (NCoutHoutWout)作为输出数据(仅批量大小 N N N保持不变)。含义如下:

  • N N N:批量大小。
  • C C C:通道数。
  • H H H:图像高度。
  • W W W:图像宽度。

这一设定使得卷积层支持对数据流进行批量处理,网络间传递的是四维数据,即,将N次的处理汇总成了1次进行:
在这里插入图片描述

1.1构造方法

对象构造方法:

torch.nn.Conv2d(
	in_channels: int,
	out_channels: int,
	kernel_size: _size_2_t,
	stride: _size_2_t = 1,
	padding: Union[str, _size_2_t] = 0,
	dilation: _size_2_t = 1,
	groups: int = 1,
	bias: bool = True,
	padding_mode: str = 'zeros',  # TODO: refine this type
	device=None,
	dtype=None
)
参数名数据类型作用
in_channelsint输入图像的通道数
out_channelsint输出图像通道数,也就是卷积核的数量,每个卷积核会生成一个输出通道。也就是卷积操作后生成的特征图数量。
kernel_sizeint或tuple卷积核的大小。如果是 int 类型,表示卷积核的高度和宽度相等;如果是 tuple 类型,如 kernel_size=(3, 5),表示卷积核的高度和宽度分别为 3 和 5。
strideint或tuple卷积步长。如果是 int 类型,表示在高度和宽度方向上的步长相等;如果是 tuple 类型,如 stride=(2, 1),表示在高度和宽度方向上的步长分别为 2 和1。默认值为 1。
paddingint或tuple填充控制padding_mode的数目。如果是 int 类型,表示在高度和宽度方向上的填充层数相等;如果是 tuple 类型,如 (1, 2),表示在高度和宽度方向上的填充层数分别为 1 和 2。
padding_modestring选择填充方式,可选值为zeros(默认值)或 reflect。前者表示零填充,后者使用输入图像边界值填充。
dilationint或tuple控制卷积核内部元素之间的间距(dilation)。如果是 int 类型,表示在卷积核内部元素之间的间距在高度和宽度方向上相等;如果是 tuple 类型,如 (2, 2),表示在高度和宽度方向上的间距分别为 2。
groupsint或tuple控制分组卷积。当 groups>1 时,表示使用分组卷积,将输入通道和输出通道分成 groups 组,并分别进行卷积操作。默认值为 1,即普通卷积。
biasbool是否在输出中添加可学习偏置
devicetorch.device指定运行在哪个设备上(例如 CPU 或 GPU)。默认值为 None,表示使用默认设备。
dtypetorch.dtype指定该层的数据类型。默认值为 None,表示使用默认数据类型。

1.2参数、偏置、属性

1.2.1参数与偏置

  在模型训练过程中,nn.Conv2d对象会不断通过反向传播更新自己的参数,包括:

  • Conv2d.weight(卷积核参数):每个卷积核都是一个可学习的参数矩阵,用于在输入图像上执行特征提取。nn.Conv2d层会学习这些卷积核的参数,使得它们能够有效地捕捉输入图像中的不同特征。
  • Conv2d.bias(偏置项参数):如果在nn.Conv2d中使用了偏置(bias=True),则在进行卷积操作时,每个输出通道的卷积结果会与相应的偏置项相加,从而得到输出特征图。

其中,偏置项参数用于引入对输入数据的线性偏移,使得模型能够更好地拟合数据。查看参数:

import torch
import torch.nn as nn

# 实例化一个二维卷积
conv_layer = torch.nn.Conv2d(in_channels=1, out_channels=1, kernel_size=(3, 3), 
                             stride=1, padding=0, bias=False)
print(f"conv_layer.bias: {conv_layer.bias}")
print(f"conv_layer.weight: {conv_layer.weight}")

在这里插入图片描述
  在创建torch.nn.Conv2d时,其权重与偏置都是随机初始化的,也可在对象创建后自行指定使用的参数:

import torch
import torch.nn as nn

# 实例化一个二维卷积
conv_layer = torch.nn.Conv2d(in_channels=1, out_channels=1, kernel_size=(3, 3), 
                             stride=1, padding=0, bias=True)
print('----------------初始化参数----------------')
print(f"conv_layer.bias: {conv_layer.bias}")
print(f"conv_layer.weight: {conv_layer.weight}")
conv_layer.bias=nn.Parameter(torch.zeros(conv_layer.bias.size()))
conv_layer.weight=nn.Parameter(torch.ones(conv_layer.weight.size()))
print('----------------新参数----------------')
print(f"conv_layer.bias: {conv_layer.bias}")
print(f"conv_layer.weight: {conv_layer.weight}")

在这里插入图片描述

1.2.2可查看属性

  对于创建的nn.Conv2d提供了以下可查看属性:

属性名功能
in_channels输入通道数
out_channels输出通道数
kernel_size卷积核大小
stride卷积操作的步长。
padding填充层数
dilation卷积核元素之间的间距
groups输入和输出通道之间的连接方式
padding_mode填充模式
weight权重参数
bias偏置项参数
print(conv_layer.in_channels)  # 输出输入通道数
print(conv_layer.out_channels)  # 输出输出通道数
print(conv_layer.kernel_size)  # 输出卷积核的大小
print(conv_layer.stride)  # 输出卷积操作的步长
print(conv_layer.padding)  # 输出填充层数
print(conv_layer.dilation)  # 输出卷积核元素之间的间距
print(conv_layer.groups)  # 输出输入和输出通道之间的连接方式
print(conv_layer.padding_mode)  # 输出填充的模式
print(conv_layer.weight)  # 输出卷积核的权重参数
print(conv_layer.bias)  # 输出偏置项的参数

在这里插入图片描述

1.3torch.nn.functional.conv2d

  torch.nn.functional.conv2d()官方地址:点击跳转,函数声明:

torch.nn.functional.conv2d(input, weight, bias=None, stride=1, 
						   padding=0, dilation=1, groups=1) -> Tensor

torch.nn.functional.conv2d()是用于执行二维卷积操作的函数,可在函数调用时直接指定卷积核的权重参数,而不需要像类那样在初始化时定义。注意,输入数据类型为TensorFloat32,且同样为 ( N , C , H , W ) (N,C,H,W) NCHW格式。

import torch
import torch.nn as nn
import torch.nn.functional as F


# 定义一个输入特征图
input_feature_map = torch.randn(size=[1, 1, 4, 4])  # N, C, H, W

# 实例化一个二维卷积
conv_layer = torch.nn.Conv2d(in_channels=1, out_channels=1, kernel_size=(3, 3),
                             stride=1, padding=0, bias=False)

# 定义卷积核参数
kernel_weight = torch.Tensor([[[[-0.0765,  0.1716,  0.2779],
                                [-0.1685, -0.1217,  0.0160],
                                [0.1584, -0.2000, -0.2148]]]])

# 设置卷积层卷积核
conv_layer.weight=nn.Parameter(kernel_weight)

# 将输入特征图送入卷积层对象得到输出特征图1
output_feature_map_1 = conv_layer(input_feature_map)

# 直接使用卷积运算函数得到输出特征图2
output_feature_map_2 = torch.nn.functional.conv2d(
    input=input_feature_map, weight=kernel_weight, bias=None, stride=1, padding=0) 

print(f"\r\n----------------输出特征图--------------------")
print(f"output feature map 1: {output_feature_map_1}")
print(f"output feature map 2: {output_feature_map_2}")

在这里插入图片描述

其中,梯度函数grad_fn=<ConvolutionBackward0>表示output_feature_map_1由卷积操作生成,可在反向传播时根据此信息计算梯度。而torch.nn.functional.conv2d只单纯进行卷积运算,并不涉及与梯度相关的操作,也不会生成梯度函数。

1.4dilation

  dilation用于控制卷积核内部元素之间的间距。如果是int类型,表示在卷积核内部元素之间的间距在高度和宽度方向上相等;如果是tuple类型,如 (2, 2),表示在高度和宽度方向上的间距分别为2。
1.dilation=0
在这里插入图片描述
  此时是最常见的普通卷积核。

2.dilation=1
在这里插入图片描述

  此时卷积核被称为扩张卷积(空洞卷积),单次计算时覆盖的面积(即感受域)由dilation=0时的3*3=9变为了dilation=1时的5*5=25。在增加了感受域的同时却没有增加计算量,保留了更多的细节信息,对图像还原的精度有明显的提升。详情见链接:点击跳转。

二、卷积操作

2.1in_channels=1, out_channels=1, kernel_size=3, stride=1, padding=0

在这里插入图片描述
  输入图像通道数为1,输出特征图通道数为1,卷积核采用3x3大小,不使用填充,步长为1。使用代码模拟:

import torch
import torch.nn as nn
import torch.nn.functional as F

# 定义输入图像
input_feature_map=torch.FloatTensor([
    [3,3,2,1,0],
    [0,0,1,3,1],
    [3,1,2,2,3],
    [2,0,0,2,2],
    [2,0,0,0,1]
]).view((1,1,5,5))

# 定义卷积核
kernel_weight = torch.Tensor([[[[0.0, 1.0,  2.0],
                                [2.0, 2.0,  0.0],
                                [0.0, 1.0,  2.0]]]])

# 实例化一个二维卷积并设置卷积核
conv_layer = torch.nn.Conv2d(in_channels=1, out_channels=1, kernel_size=(3, 3),
                             stride=1, padding=0, bias=False)
conv_layer.weight=nn.Parameter(kernel_weight)

# 将输入特征图送入卷积层对象得到输出特征图1
output_feature_map = conv_layer(input_feature_map)
output_feature_map

在这里插入图片描述

2.2in_channels=1, out_channels=1, kernel_size=3, stride=2, padding=1

在这里插入图片描述
  输入图像通道数为1,输出特征图通道数为1,卷积核采用3x3大小,使用填充(填充后输入图像大小为7x7),步长为2。使用代码模拟:

import torch
import torch.nn as nn
import torch.nn.functional as F

# 定义输入图像
input_feature_map=torch.FloatTensor([
    [3,3,2,1,0],
    [0,0,1,3,1],
    [3,1,2,2,3],
    [2,0,0,2,2],
    [2,0,0,0,1]
]).view((1,1,5,5))

# 定义卷积核
kernel_weight = torch.Tensor([[[[0.0, 1.0,  2.0],
                                [2.0, 2.0,  0.0],
                                [0.0, 1.0,  2.0]]]])

# 实例化一个二维卷积并设置卷积核
conv_layer = torch.nn.Conv2d(in_channels=1, out_channels=1, kernel_size=(3, 3),
                             stride=2, padding=1, bias=False)
conv_layer.weight=nn.Parameter(kernel_weight)

# 将输入特征图送入卷积层对象得到输出特征图1
output_feature_map = conv_layer(input_feature_map)
output_feature_map

在这里插入图片描述

2.3in_channels=2, out_channels=3, kernel_size=3, stride=1, padding=0

在这里插入图片描述
  在2.1、2.2中使用的输入图像与卷积核都是单通道的,且输入图像与卷积核批大小均为1,事实上,在实际训练模型过程中二者一般并不相等。卷积核的形状:
在这里插入图片描述
  一个卷积核与原图像运算时,无论二者是否是1通道,生成特征图的通道均为1,最后将所有特征图叠加进行输出,故输出图像的通道数(对应 o u t _ c h a n n e l s out\_channels out_channels参数)由卷积核个数(对应卷积核形状的 C o u t C_{out} Cout)决定,即, o u t _ c h a n n e l s = = C o u t out\_channels==C_{out} out_channels==Cout。细化到每一个卷积核,当一个卷积核与输入图像运算时,要求卷积核通道数与输入图像通道数相同(对应通道的矩阵进行运算),即 C i n = = i n _ c h a n n e l s C_{in}==in\_channels Cin==in_channels。总结:

  • 输出图像通道数等于卷积核数,即 o u t _ c h a n n e l s = = C o u t out\_channels==C_{out} out_channels==Cout
  • 卷积核通道数等于输入图像通道数,即 C i n = = i n _ c h a n n e l s C_{in}==in\_channels Cin==in_channels

2.4设置padding使特征图与原图像大小相等

  方法一:

padding = (kernel_size - 1) // 2  # kernel_size 必须为奇数

  方法二:

padding = (kernel_size * 2 + 1) // 2  # kernel_size 可以为偶数

2.5分组卷积

  group=in_channels,碰到再弄懂吧。

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

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

相关文章

Nuxt3 实战 (十二):SEO 搜索引擎优化指南

添加 favicon 图标和 TDK&#xff08;标题、描述、关键词&#xff09; nuxt.config.ts 添加配置&#xff1a; export default defineNuxtConfig({app: {title:Dream Site,meta: [{ name: keywords, content: Nuxt.js,导航,网站 },{ name: description, content: 致力于打造程…

详细解析MATLAB和Simulink中的文件格式:mat, mdl, mexw32, 和 m 文件

matlab 探索MATLAB和Simulink中的文件格式&#xff1a;MAT, MDL, MEXW32, 和 M 文件**MAT 文件 (.mat)****MDL 文件 (.mdl)****MEX 文件 (.mexw32/.mexw64)****M 文件 (.m)****总结** 探索MATLAB和Simulink中的文件格式&#xff1a;MAT, MDL, MEXW32, 和 M 文件 当你开始使用M…

JS(JavaScript)入门指南(DOM、事件处理、BOM、数据校验)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。 玉阶生白露,夜久侵罗袜。 却下水晶帘,玲珑望秋月。 ——《玉阶怨》 文章目录 一、DOM操作1. D…

MySQL:内置函数、复合查询

文章目录 1.日期函数2.字符串函数3.数学函数4.其他函数5.复合查询5.1基本复合查询5.2 多表查询5.3 自连接5.4 子查询5.4.1 子查询与where5.4.2 子查询与from5.4.3 合并查询 1.日期函数 日期&#xff1a;年月日 时间&#xff1a;时分秒 日期函数的使用&#xff1a; 案例&…

print()函数——打印输出

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 print()函数是Python编程最常见的函数&#xff0c;常用于输出程序结果&#xff0c;默认输出到屏幕&#xff0c;也可以输出到指定文件。 语法参考 pr…

VNode是什么?

什么是VNode VNode的全称是Virtual Node,也就是虚拟节点.它是指一个抽象的节点对象&#xff0c;用于描述真实DOM中的元素。在前端框架中&#xff0c;通过操作VNode来实现虚拟DOM&#xff0c;从而提高性能。 VNode的本质 本质上是JavaScript对象,这个对象就是更加轻量级的对DOM…

【Windows 常用工具系列 17 -- windows bat 脚本多参数处理】

请阅读【嵌入式开发学习必备专栏】 文章目录 bat 脚本命令行参数使用示例多参数处理使用示例遍历所有参数 bat 脚本命令行参数 在Windows批处理&#xff08;.bat&#xff09;脚本中接收命令行参数是一个常见的需求&#xff0c;这样的脚本能够根据提供的参数执行不同的操作。命…

VS 在多线程中仅调试某个线程

调试多线程程序时&#xff0c;只想观察某个线程的运行情况&#xff1b; 但是&#xff0c;由于线程切换执行&#xff0c;会导致调试时焦点在几个代码块之间跳来跳去&#xff0c;故需要解决这个问题。 参考文章&#xff1a; C#使用线程窗口调试多线程程序。 1 打开线程窗口&…

Unity开发中遇到的问题以及解决思路 Ver1.0

文章目录 Git1.明明连接成功了&#xff0c;为什么显示仓库不存在&#xff1f; UI1.从Resources加载图片&#xff1a;路径没错却加载为空&#xff1f;2.滚动页面想让他只在纵向或者横向滚动怎么办&#xff1f;3.滚动页面的元素是从中间向两边生成怎么办&#xff1f;4.如何让ui物…

Yolo v5实现细节(2)

Yolo v5代码实现细节 IOU系列损失 在之前的yolo v3中我们使用的定位损失主要使用的是差值平方的形式&#xff0c;通过预测边界框的参数和真实边界框的参数来进行计算求解的。 定位损失 L loc ( t , g ) ∑ i ∈ pos ( σ ( t x i ) − g ^ x i ) 2 ( σ ( t y i ) − g ^ …

高三学生的倒计时 给高考一个倒计时 让学习更有计划的进行

高三学生的压力是很大的&#xff0c;时间也是很紧迫&#xff0c;仅仅一年的时间&#xff0c;许多人都觉得不够用&#xff0c;为了让学子们更有时间紧迫感&#xff0c;更清晰的掌握时间&#xff0c;我们需要一个准确提醒的倒计时效果。 把这个倒计时放到班级电脑上&#xff0c;是…

DataGrip 2024 po for Mac 数据库管理工具解

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

LLMs 驱动的数据合成、整理和评估

1. AI 速读 总体概要 本文综述了大型语言模型&#xff08;LLMs&#xff09;在合成数据生成、筛选和评估方面的最新进展&#xff0c;旨在为学术和工业界提供深入、系统化的研究方向。文章强调了合成数据在解决真实世界数据局限性中的重要性&#xff0c;特别是在数据量和质量方…

汇聚荣做拼多多运营,是新手怎么做?

作为电商领域的一颗新星&#xff0c;拼多多以其独特的商业模式迅速崛起&#xff0c;吸引了众多商家和消费者的目光。对于新手来说&#xff0c;如何在拼多多平台上开展运营活动&#xff0c;成为了许多初入电商领域的人们关心的问题。本文将围绕如何做好拼多多运营这一核心内容&a…

类与对象(1)

1.c升级了类 C 语言结构体中只能定义变量&#xff0c;在 C 中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。 比如&#xff1a; 之前在数据结构初阶中&#xff0c;用 C 语言方式实现的栈&#xff0c;结构体中只能定义变量 &#xff1b;现在以 C 方式实现&…

期货交易记录20240626

文章目录 期货交易系统构建第一步、选品第二步、心态历练第三步、开仓纪律第四步、持仓纪律第五步、接下来的计划 2024年6月26号&#xff0c;开始写期货交易的第四篇日记。 交易记录&#xff1a;做了一笔纯碱的多单&#xff0c;在回撤了400个点左右后&#xff0c;看到企稳信号后…

升级外贸ERP保留历史数据,拥抱技术革新赢得未来

一些做了二十多年外贸的老公司&#xff0c;早期就通过使用ERP软件来进行订单的处理&#xff0c;但是随着互联网的发展&#xff0c;用的年岁久了&#xff0c;软件运行速度也变卡了&#xff0c;看到别人家的新功能也眼馋&#xff0c;但是就是不敢升级&#xff0c;担心一升级&…

数据采集Selenium中的弹窗处理

在爬虫技术中&#xff0c;弹窗处理是一个常见但具有挑战性的问题。Selenium作为一个强大的网页自动化工具&#xff0c;可以帮助我们有效地处理网页中的各种弹窗。本文将概述如何使用Selenium处理弹窗&#xff0c;并提供实现代码&#xff0c;代码中将使用代理IP技术。 概述 弹…

前端项目vue3/React使用pako库解压缩后端返回gzip数据

pako仓库地址&#xff1a;https://github.com/nodeca/pako 文档地址&#xff1a;pako 2.1.0 API documentation 外部接口返回一个直播消息或者图片数据是经过zip压缩的&#xff0c;前端需要把这个数据解压缩之后才可以使用&#xff0c;这样可以大大降低网络数据传输的内容&…

茴香豆接入微信个人助手部署

将rag产品接入微信工作群&#xff0c;自动回答问题&#xff0c;香吗&#xff1f;&#xff1f; let‘s go 1、打开openxlab平台&#xff0c;找到茴香豆web产品应用中心-OpenXLab 点击进入&#xff0c;设置知识库名字和密码 2、上传知识库文件和编辑正反例等 3、然后进行测试问答…