Conv1d与Conv2d函数用法

news2024/9/23 7:24:58

Conv1dConv2d 分别是卷积神经网络(CNN)中的两种卷积层操作,它们在处理不同维度的数据上有联系和区别,本文是一篇学习笔记。

本文主要包括以下内容:

  • 1.联系
  • 2.区别
  • 3.Conv1d卷积
  • 4.Conv2d卷积
  • 5.图解Conv1d卷积
    • (1)Full 卷积(全卷积,Full Convolution)
    • (2)Same 卷积(相同卷积,Same Convolution)
    • (3) Valid 卷积(有效卷积,Valid Convolution)
  • 6.图解Conv2d卷积
  • 7.Conv1d的pytorch实现
    • (1)代码示例
    • (2)注意事项
  • 8.Conv2d的pytorch实现
    • (1)代码示例
    • (2)注意事项

1.联系

  1. 卷积操作原理:无论是 Conv1d 还是 Conv2d,它们的基本原理都是一样的,都是通过卷积核(或滤波器)与输入数据进行卷积运算,以提取特征。

  2. 神经网络中的使用Conv1d 通常用于处理序列数据,如文本数据或音频数据,因为它在一个维度上进行卷积操作。而 Conv2d 通常用于处理图像数据,因为它在两个维度上进行卷积操作。

  3. 参数配置:它们都可以配置卷积核的大小、步幅、填充等参数,以控制卷积操作的行为。

2.区别

  1. 维度:最明显的区别是维度。Conv1d 是一维卷积,主要用于处理一维序列数据,如文本或音频。而 Conv2d 是二维卷积,主要用于处理二维数据,如图像。

  2. 卷积核的形状:在 Conv1d 中,卷积核是一维的,通常表示为 (kernel_size,)。而在 Conv2d 中,卷积核是二维的,通常表示为 (height, width)。

  3. 输入数据的维度Conv1d 的输入数据是一维的,形状通常为 (batch_size, channels, sequence_length),其中 sequence_length 表示序列的长度。而 Conv2d 的输入数据是二维的,形状通常为 (batch_size, channels, height, width),其中 heightwidth 表示图像的高度和宽度。

  4. 应用领域:由于不同的数据类型和维度要求,它们在不同的应用领域中得到广泛使用。Conv1d 用于文本分类、语音识别等,而 Conv2d 用于图像分类、目标检测等。

总之,Conv1dConv2d 是卷积神经网络中的两种常见卷积操作,它们在维度、卷积核的形状和应用领域等方面存在区别。选择合适的卷积层取决于输入数据的类型和任务要求。

3.Conv1d卷积

一维卷积在深度学习中有几种常见的变体,包括:

  1. Valid 卷积(有效卷积,Valid Convolution): 这是一种常见的卷积操作,它不对输入进行填充,因此输出的大小会随着卷积核的大小和步幅的设置而减小。这意味着在有效卷积中,输出序列的长度会小于输入序列的长度。

  2. Same 卷积(相同卷积,Same Convolution): Same 卷积旨在保持输出的大小与输入的大小相同。为了实现这一点,填充会添加到输入的两侧,以使输出大小保持不变。在一维卷积中,通常将填充大小设置为卷积核大小的一半。

  3. Full 卷积(全卷积,Full Convolution): 全卷积操作的目标是生成一个输出大小大于输入大小的输出。这通常需要添加大量的填充以实现,以使输出的大小大于输入的大小。

这些卷积操作可以根据任务需求进行选择。Valid 卷积通常用于减小特征图的大小,以减少模型参数和计算成本。Same 卷积通常用于保持输出和输入的大小一致,有助于保留更多的信息。Full 卷积可能不太常见,但在某些特定情况下可能会有用。

选择哪种卷积操作取决于你的任务和模型设计的需要。

4.Conv2d卷积

在二维卷积中,通常不像一维卷积那样明确定义为有效卷积、相同卷积和全卷积。相反,二维卷积的种类更多,可以根据不同的需求和应用进行调整和组合。以下是一些常见的二维卷积类型和变体:

  1. 标准的二维卷积(2D Convolution):这是最常见的卷积操作,用于图像处理和计算机视觉等任务。

  2. 分离卷积(Separable Convolution):将标准的二维卷积分解成两个独立的卷积操作,分别在水平和垂直方向执行,以减少计算量。

  3. 转置卷积(Transpose Convolution或Deconvolution):用于上采样、反卷积和生成分割结果等任务,可以扩大特征图的尺寸。

  4. 空洞卷积(Dilated Convolution):通过在卷积核内部引入空洞(也称为膨胀率)来增加感受野,常用于语义分割等任务。

  5. 深度可分离卷积(Depthwise Separable Convolution):将卷积操作分成深度卷积和逐点卷积两个步骤,以减少参数数量和计算量。

  6. 膨胀卷积(Atrous Convolution):与空洞卷积类似,可以通过调整膨胀率来控制感受野的大小。

这些是二维卷积的一些常见类型和变体,根据任务需求和模型架构的不同,可以选择适当的卷积操作。二维卷积在图像处理和计算机视觉领域有广泛的应用,它们能够有效地捕捉和提取图像中的特征。

5.图解Conv1d卷积

以一个长度为5的一维张量I和长度为3的一维张量k(卷积核)为例,介绍其过程。
在这里插入图片描述

(1)Full 卷积(全卷积,Full Convolution)

Full卷积的计算过程是:K沿着I顺序移动,每移动到一个固定位置,对应位置的值相乘再求和,计算过程如下:
在这里插入图片描述
将得到的值依次存入一维张量Cfull,该张量就是I和卷积核K的full卷积结果,其中K卷积核或者滤波器或者卷积掩码,卷积符号用符号表示,记Cfull=IK
在这里插入图片描述

(2)Same 卷积(相同卷积,Same Convolution)

在这里插入图片描述
卷积核K都有一个锚点,然后将锚点顺序移动到张量I的每一个位置处,对应位置相乘再求和,计算过程如下:
在这里插入图片描述
在这里插入图片描述
假设卷积核的长度为FL,如果FL为奇数,锚点位置在(FL-1)/2处;如果FL为偶数,锚点位置在(FL-2)/2处。

(3) Valid 卷积(有效卷积,Valid Convolution)

从full卷积的计算过程可知,如果K靠近I,就会有部分延伸到I之外,valid卷积只考虑I能完全覆盖K的情况,即K在I的内部移动的情况,计算过程如下:
在这里插入图片描述

在这里插入图片描述
三种卷积类型的关系
在这里插入图片描述

6.图解Conv2d卷积

本文只介绍标准的二维卷积(2D Convolution)
在这里插入图片描述

下图蓝色表示输入,绿色表示输出,卷积核为:

012
220
012

在这里插入图片描述

7.Conv1d的pytorch实现

Conv1d 是一维卷积层,通常用于处理一维序列数据,如文本数据或时间序列数据。在深度学习中,它常用于提取序列数据中的特征。下面是 Conv1d 的基本用法以及一个示例:

首先,我们需要导入 PyTorch 中的相关库和模块:

import torch
import torch.nn as nn

然后,可以创建一个 Conv1d 层并指定一些参数,如输入通道数、输出通道数、卷积核大小、填充等。通常还需要定义一个激活函数(如 ReLU)来应用在卷积后的结果上。

# 创建 Conv1d 层
conv1d_layer = nn.Conv1d(in_channels, out_channels, kernel_size, stride, padding)

# 创建激活函数(可选)
relu = nn.ReLU()

接下来,我们可以使用 conv1d_layer 对输入数据进行卷积操作,并在卷积结果上应用激活函数。最后可以获得卷积后的结果。

# 对输入数据进行卷积操作
conv_output = conv1d_layer(input_data)

# 应用激活函数
output = relu(conv_output)

(1)代码示例

以下是一个示例,演示了如何使用 Conv1d 处理一维序列数据:

import torch
import torch.nn as nn

# 创建示例输入数据,假设有一批文本数据,每个文本包含10个单词,每个单词用一个嵌入向量表示
batch_size = 64
sequence_length = 10
embedding_dim = 50

# 随机生成输入矩阵
input_data = torch.randn(batch_size, embedding_dim, sequence_length)

# 创建 Conv1d 层,对文本数据进行卷积操作
in_channels = embedding_dim  # 输入通道数,等于嵌入向量的维度
out_channels = 64  # 输出通道数,可以根据任务需求调整
kernel_size = 3  # 卷积核的大小,通常设置为3或5等
stride = 1  # 步幅,通常为1
padding = 1  # 填充大小,根据卷积核的大小和序列长度来调整

conv1d_layer = nn.Conv1d(in_channels, out_channels, kernel_size, stride, padding)

# 创建激活函数(ReLU)
relu = nn.ReLU()

# 对输入数据进行卷积操作
conv_output = conv1d_layer(input_data)

# 应用激活函数
output = relu(conv_output)

print(output.shape)  # 输出的形状取决于卷积操作的参数设置

#torch.Size([64, 64, 10])

在这个示例中,我们首先创建了一个示例的输入数据,假设它是一批文本数据,每个文本包含10个单词,每个单词用一个50维的嵌入向量表示。然后,我们创建了一个 Conv1d 层,对文本数据进行卷积操作,最后应用了 ReLU 激活函数。输出的形状取决于卷积操作的参数设置。通常,你可以将卷积操作的输出作为后续神经网络的输入,以继续进行任务如文本分类或情感分析。

(2)注意事项

在上述代码中,padding 参数的不同值将会影响卷积的类型,具体如下:

1) padding=0 如果将 padding 设置为 0,那么卷积将执行有效卷积(Valid Convolution)。这意味着卷积核只会在输入的有效区域内滑动,输出的大小会随着卷积核的大小和步幅而减小。

2) padding=1 如果将 padding 设置为 1,那么卷积将执行一维 “same” 卷积(Same Convolution)。这意味着卷积核会在输入的两侧添加一个单位的填充,以保持输出的大小与输入的大小相同。
3)****padding = kernel_size - 1 假设你的卷积核大小为 kernel_size,那么要实现一维 Full 卷积,padding 的值应该是 kernel_size - 1。例如,如果你的卷积核大小为kernel_size= 3,那么为了执行一维 Full 卷积(Full Convolution),你应该将padding设置为 2,因为 3 - 1 = 2。这将在输入序列的两侧分别添加 2 个单位的填充,从而使输出的大小大于输入的大小。

所以,不同的 padding 值会导致不同类型的卷积操作,其中 padding=0 对应有效卷积,而 padding=1 对应一维 “same” 卷积, kernel_size - 1对应全卷积。这会影响输出的大小和卷积操作的性质。你可以根据你的任务需求选择适当的填充方式。

8.Conv2d的pytorch实现

Conv2d 是二维卷积层,通常用于处理图像数据,它在卷积神经网络(CNN)中被广泛使用以提取图像中的特征。下面是 Conv2d 的基本用法以及一个示例:

首先,我们需要导入 PyTorch 中的相关库和模块:

import torch
import torch.nn as nn

然后,我们可以创建一个 Conv2d 层并指定一些参数,如输入通道数、输出通道数、卷积核大小、填充等。同样的,还需要定义一个激活函数(如 ReLU)来应用在卷积后的结果上。

# 创建 Conv2d 层
conv2d_layer = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)

# 创建激活函数(可选)
relu = nn.ReLU()

接下来,我们可以使用 conv2d_layer 对输入数据进行卷积操作,并在卷积结果上应用激活函数。最后可以获得卷积后的结果。

# 对输入数据进行卷积操作
conv_output = conv2d_layer(input_data)

# 应用激活函数
output = relu(conv_output)

(1)代码示例

以下是一个示例,演示了如何使用 Conv2d 处理图像数据:

import torch
import torch.nn as nn

# 创建示例输入数据,假设有一批图像数据,每个图像的尺寸为64x64像素,具有3个通道(RGB)
batch_size = 64
channels = 3
height = 64
width = 64

# 随机生成输入矩阵
input_data = torch.randn(batch_size, channels, height, width)

# 创建 Conv2d 层,对图像数据进行卷积操作
in_channels = channels  # 输入通道数,等于图像的通道数
out_channels = 64  # 输出通道数,可以根据任务需求调整
kernel_size = 3  # 卷积核的大小,通常设置为3x3或5x5等
stride = 1  # 步幅,通常为1
padding = 1  # 填充大小,根据卷积核的大小和图像尺寸来调整

conv2d_layer = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)

# 创建激活函数(ReLU)
relu = nn.ReLU()

# 对输入数据进行卷积操作
conv_output = conv2d_layer(input_data)

# 应用激活函数
output = relu(conv_output)

print(output.shape)  # 输出的形状取决于卷积操作的参数设置

# torch.Size([64, 64, 64, 64])

在这个示例中,我们首先创建了一个示例的输入数据,假设它是一批图像数据,每个图像的尺寸为64x64像素,具有3个通道(RGB)。然后,我们创建了一个 Conv2d 层,对图像数据进行卷积操作,最后应用了 ReLU 激活函数。输出的形状取决于卷积操作的参数设置。通常,你可以将卷积操作的输出作为后续神经网络的输入,以继续进行图像分类、目标检测或其他图像处理任务。

(2)注意事项

在上面的代码中,实现不同类型的二维卷积主要涉及改变卷积核的设置和使用不同的PyTorch卷积层。虽然padding值是其中一个参数,但它不是唯一的参数,不同类型的卷积需要更多的变化。以下是一些常见的二维卷积类型和变体以及它们的参数设置:

1) 标准的二维卷积
使用 nn.Conv2d 创建卷积层,设置合适的 in_channelsout_channelskernel_sizestridepadding

2) 分离卷积
分离卷积需要使用 nn.Conv2d 创建两个卷积层,一个用于深度卷积(depthwise),另一个用于逐点卷积(pointwise)。
需要合适地设置卷积核的大小和步幅,以及在两个卷积层之间进行数据的转换。

3) 转置卷积
使用 nn.ConvTranspose2d 创建卷积层,设置合适的 in_channelsout_channelskernel_sizestridepadding
转置卷积通常用于上采样任务,所以通常会增大特征图的尺寸。

4) 空洞卷积
使用 nn.Conv2d 创建卷积层,设置合适的 in_channelsout_channelskernel_sizestridepaddingdilation(膨胀率)参数。

5) 深度可分离卷积
深度可分离卷积需要使用 nn.Conv2d 创建两个卷积层,一个用于深度卷积,另一个用于逐点卷积。
需要合适地设置卷积核的大小和步幅,以及在两个卷积层之间进行数据的转换。

不同类型的卷积需要不同的设置,包括卷积核大小、步幅、填充等。因此,改变卷积类型通常需要更改卷积层的参数设置,并根据任务需求进行适当的调整。在PyTorch中,有多种不同类型的卷积层可以用来实现这些卷积操作,需要根据具体需求进行选择和配置。

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

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

相关文章

一文告知HTTP GET是否可以有请求体

HTTP GET是否可以有请求体 先说结论: HTTP协议没有规定GET请求不能携带请求体,但是部分浏览器会不支持,因此不建议GET请求携带请求体。 HTTP 协议没有为 GET 请求的 body 赋予语义,也就是即不要求也不禁止 GET 请求带 body。大多数…

教资一年可以考几次 教资考试每年次数介绍

教师资格证一年可以考两次。根据教师资格证考试规定,为了满足报考人员的工作需求,达到市场供求均衡的状态,教师资格证区别于其他的技术资格类的考试,会每年举行两次考试,分别在上半年和下半年各举行一次考试。 上半年…

设计模式 - 行为型模式考点篇:策略模式(概述 | 案例实现 | 优缺点 | 使用场景)

目录 一、行为型模式 1.1、策略模式 1.1.1、概论 1.1.2、案例实现 1.1.3、优缺点 1.1.4、使用场景 一、行为型模式 1.1、策略模式 1.1.1、概论 策略模式设计的每一个算法都封装了起来,使他们可以相互替换,通过一个对象委派不同的算法给相应的客户…

【网络安全】关于CTF那些事儿你都知道吗?

关于CTF那些事儿你都知道吗? 前言CTF那些事儿内容简介读者对象专家推荐 本文福利 前言 CTF比赛是快速提升网络安全实战技能的重要途径,已成为各个行业选拔网络安全人才的通用方法。但是,本书作者在从事CTF培训的过程中,发现存在几…

Ant Design of React 创建项目及运行环境

Ant Design of React 学习笔记(1) 创建项目及运行环境 本文使用 create-react-app 创建一个 TypeScript 项目,并引入 antd。 1.命令行cd到对应的目录,这里是npm下回车运行,其他如pnpm yarn参考官网 npx create-reac…

Java实验(头歌) -Java继承和多态接口

/*** 编写程序,实现两个数的求和运算和比较*/ // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码 /********** Begin **********/ // 定义一个接口类 Compute// 第一个为 sum(),实现两个数的相加,返回值为 int// 第二个为 max()…

【软件测试】APP 上架指南:iOS App Store 首次上架被拒原因分析与解决方案

目录 一、前言 二、APP 审核备案新规 (1)iOS 上架审核申请被拒 (2)苹果应用商店重大调整 (3)首次备案流程 ① 阿里云备案 ② 华为云备案 ③ 腾讯云备案 三、iOS 首次上架拒审原因分析 &#…

动捕设备推动舞蹈表演动作捕捉动画制作突破边界

动捕设备是音乐动画制作中获得巨大创作潜力的一种全新途径。使用全身动捕设备可以花更少的时间编辑预制动画资产,从而节省时间投入到创建更为丰富的动画制作环境中。 如广州虚拟动力对于舞蹈表演动作捕捉动画制作服务,能够提供惯性动捕设备vdsuit full以…

ctfshow-web2(SQL注入)

打开题目链接,是一个登录框,尝试弱口令登录 没什么反应 尝试万能密码登录 页面发生了变化 并未登录进去,但是有回显,大概率是SQL注入了 这里尝试了很久,尝试过程就不写了,最终判断它的注入点在用户名&…

C++ 类和对象篇(七) 运算符重载

目录 一、运算符重载 1. 运算符重载是什么? 2. 为什么要运算符重载? 3. 怎么进行运算符重载? a. 运算符重载函数的格式 b. 参数的个数和要重载的运算符操作数相同 c. 运算符重载函数必须有一个类类型参数 4. 注意事项 二、 赋值运算符重载 1.…

提升企业形象与效率,申请办理400电话客服中心

引言: 随着企业竞争的日益激烈,提供优质的客户服务成为企业赢得市场份额的关键。而400电话客服中心的建立,不仅可以提升企业形象,还能提高客户满意度和工作效率。本文将介绍400电话客服中心的申请办理过程,以及其对企业…

Starrc读lef遇到的常见错误

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 ERROR: the definition cell "BUFXX" instantiated as xx in DEF file xx is not found.(SX-2144) ERROR: Instance xx has no definition. (SX-2505) 这个问题就是典型的lef数据不全,…

lua学习笔记

单行注释: 多行注释: 命名: Lua不支持下划线大写字母,比如:_ABC 但支持:_abc 关键字: 全局变量: 直接变量名 内容就是全局 局部变量: 加上local即可 nil&#xff1…

【多线程案例】阻塞队列,实现生产者消费者模型

阻塞队列(BlockingQueue) 阻塞队列是多线程代码中比较常用的一种数据结构。是一种特殊的队列,带有阻塞特性。 为何说是一种特殊的队列? 1.线程安全 2.带有阻塞特性 如果队列为空,继续出队列,就会发生阻塞…

零基础Linux_13(基础IO_文件)文件系统接口+文件描述符fd+dup2函数

目录 1. C语言的文件操作 1.1 C语言文件的写入 1.2 当前路径 1.3 文件操作模式 1.4 文件的读取和cat 2. 文件系统接口 2.1 系统调用与封装 2.2 open打开文件 2.2.1 flags标记位 2.2.2 open用法演示 2.3 close关闭文件和write写入文件和rede读取文件 2.3.1 O_TRUNC…

基于JSP的动漫论坛

摘 要 作为文化产业的一部分,动漫影响了我国一代又一代青少年,据钱江晚报调查显示,有超过七成的95后愿意从事与动漫相关的行业,可见其对青少年影响力之大。 动漫论坛作为最先开始热爱动漫人士进行交流的方式之一,是爱…

Reactor网络模式

文章目录 1. 关于Reactor模式的了解2. 基于Reactor模式实现epoll ET服务器2.1 EventItem类的实现2.2 Reactor类的实现Dispatcher函数AddEvent函数DelEvent函数EnableReadWrite函数 2.3 四个回调函数的实现acceptor回调函数recver回调函数sender回调函数errorer回调函数 3. epol…

TensorFlow入门(十五、数据读取机制(2))

使用Dataset创建和读取数据集,作为TensorFlow模型创建输入管道的新方式,使用性能比使用feed_dict或队列式管道的性能高很多,使用也更加简洁容易。也是google强烈推荐的数据读取方式,对于TensorFlow而言,十分重要。 Dataset是什么? Dataset的定义 : 它是一个含有相同类型元素且…

C++局部变量 成员变量 全局变量(及文件内外全局变量)

在C中,类的局部变量、成员变量、全局变量、静态全局变量: 局部变量:局部变量是在函数内部定义的变量,它只能在该函数的范围内被访问和修改。当函数执行结束后,局部变量的内存空间会被释放。局部变量主体是函数。局部变…

如何成为一名云计算构架师,看这里!

都说,每个程序员心中都有一个成为架构师的梦想! 因为不管是对于自身专业技能的认可,还是立足于现实的薪资,都是令人向往的! 1.云计算架构师介绍 云计算架构师负责管理企业中的云计算架构,尤其是在云技术…