关于PyTorch中一维卷积Conv1d的理解

首先明确一点,PyTorch中的一维卷积是从左往右做的,不是从上往下。

然后明确第二点,一维卷积和二维卷积最大的区别在于,一维卷积的卷积方向只有一个维度,一维卷积的卷积核不像二维卷积核一样可以左右和上下两个维度移动,在PyTorch中,一维卷积核仅仅可以在左右这个单一的一维方向上移动,移动的步长由stride参数确定,而卷积核是否会移动出待卷积的数据由padding参数确定,这里的“移动出”意味着卷积核的某些部分可能会移动到待卷积数据之外,而仍然有某些卷积核数据和待卷积数据相重合,具体例子请见后续说明。

torch.nn.Conv1d(
    in_channels: int,
    out_channels: int,
    kernel_size: _size_1_t,
    stride: _size_1_t = 1,
    padding: _size_1_t | str = 0,
    dilation: _size_1_t = 1,
    groups: int = 1,
    bias: bool = True,
    padding_mode: str = 'zeros',
    device: Any | None = None,
    dtype: Any | None = None
)

上述是PyTorch中一维卷积函数的声明,其中的参数很重要,这里主要只用到前面几个。

考虑一个一维卷积的使用:

nn.Conv1d(
    in_channels=32,
    out_channels=128,
    kernel_size=20,
    stride=1,
    padding='same',
),

我有一个batch的数据:

N \times 32 \times 500

其中 N 为我的 batch size。

那么首先第一点,从整体上来看,我的数据可以理解为,对于 32×500的矩阵,我有N个,那么一共会有out_channels个卷积核,其中每个卷积核都会在32×500的矩阵上做卷积,每个卷积核要对N个矩阵都做一次,那么最终会得到的数据应该是 N×out_channels×A,其中A不知道,要看具体的卷积情况而言。

这里很重要的一点是,对于一个卷积核,它的size是a×b,但在函数中的kernel_size我们只给了一个单值,事实上,一个一维卷积核的size会是in_channels×kernel_size,没错,对于batch size为N的批量数据中的每一个数据而言,对于其中每一个32×500的矩阵而言,其对应的卷积核的高度和矩阵的高度是一致的,也就是说,对于N×32×500的数据而言,它的一维卷积参数的in_channels应该为32。

然后卷积核会在横向的方向上移动,接下来就很好理解了,如果padding为valid,那么最终得到的数据维度应该为N×out_channels×int(\frac{500-kernel\_size}{stride})+1,如果padding为same,那么意味着卷积核可以移动到待卷积的矩阵之外,最终得到的数据维度应该还为N×out_channels×500。

下面以N×3×10的批量数据为例,下面的表格显示的是其中一个矩阵3×10的情况,然后conv1d的声明为

nn.Conv1d(
    in_channels=3,
    out_channels=2,
    kernel_size=4,
    stride=1,
    padding='same',
),

 那么首先我们会得到一个3×4的卷积核,其中卷积核的高度3(in_channels)和矩阵的高度3一致(如果矩阵的高度为4,或者别的什么高度,那么in_channels也要为4,高度这里是定死的,卷积核只能够向右边一个维度移动,不能够上下移动,这也是一维卷积的含义),然后卷积核的宽度为4,卷积方向一直朝右走。

 后面的就省略了,一直到卷积核移动到最后的部分。

然后到此时注意看padding参数的值,如果是'valid',那么卷积核就不能再走了,如果是'same'那么还可以往右继续移动,移动出去的部分没有覆盖到数据,这些没有数据的地方由矩阵最外面那一圈的数据替代,需要注意的是,当出现下面这种情况的时候

如果padding是same,仍然是ok的,最右边多出来的数据全部由矩阵(待卷积数据)最右边一列的数据替代。因此,如果Conv1d的kernel_size是999999,而padding是same,那么哪怕给定的批数据的shape为N×in_channels×1都没有问题,多出来的数据全部由边界来替代。

same的另一个含义是最终得到的维度和原数据维度相同,如果是valid卷积,那么宽度为W的数据卷积出来的最终宽度应为int(\frac{W-kernel\_size}{stride})+1,而如果是same,那么卷积出来的数据的宽度仍然为W。

上述内容讲述了一个一维卷积核在一个批数据中单个矩阵中的操作,仍然沿用上面例子中的各个参数,padding为same,对于一个批数据N×3×10中的一个3×10的矩阵进行一维卷积而言,得到一个一维的数据1×10,而out_channels=2,这意味着会有两个卷积核同时对每个矩阵进行卷积,最后仍然会得到一个批量数据,批量维度N是不变的,最后得到的数据维度为N×2(out_channels)×10(原矩阵的宽度,因为padding是same)。

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

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

相关文章

【使用时空RBF-NN进行非线性系统识别】实现了 RBF、分数 RBF 和时空 RBF 神经网络,用于非线性系统识别研究(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 2.1 算例1 2.2 算例2 🎉3 参考文献 🌈4 Matlab代码实现 💥1 概述 本文用于非线性系统识别任务的径向基函数神经网络(RBF-NN)的三种变体。特别是,我实现…

大模型,开源干不掉闭源

开源大模型对闭源大模型的冲击,变得非常猛烈。 今年3月,Meta发布了Llama(羊驼),很快成为AI社区内最强大的开源大模型,也是许多模型的基座模型。有人戏称,当前的大模型集群,就是一堆各…

刘铁猛C#教程笔记——操作符

C#语言中的操作符 表中位于同一行的操作符优先级相同,从上到下优先级依次减弱; 操作符的用法举例 成员访问运算符——“.”:用于访问类中的成员或者访问位于某个名空间中的类,如: using System; using System.Collec…

25.3 matlab里面的10中优化方法介绍——Nelder-Mead法(matlab程序)

1.简述 fminsearch函数用来求解多维无约束的线性优化问题 用derivative-free的方法找到多变量无约束函数的最小值 语法 x fminsearch(fun,x0) x fminsearch(fun,x0,options) [x,fval] fminsearch(...) [x,fval,exitflag] fminsearch(...) [x,fval,exitflag,output] fmins…

使用sftp

一、背景 新项目组前端部署方式是Build打包生成dist文件,交由后端部署。后来知道了vscode安装sftp前端可以自行部署。 二、实操 1、vscode安装sftp 2、 配置 ①F1 / ctrlshiftp ②命令行输入sftp -> 选择 sftp: Config ③配置信息介绍 {"name"…

vscode默认gbk编码格式打开

目录 1. 问题描述2. 解决方案 1. 问题描述 每次打开vscode都是utf-8格式打开文件,然后满屏的中文乱码,自己手动换成gbk编码 后中文显示正常,但是换多了很烦。 2. 解决方案 ctrlshiftP 点首选项:打开用户设置 加上这行在最后&…

SpringBoot静态资源访问及参数处理

静态资源访问: 资源访问: 1:Spring Boot 支持静态和模板化的欢迎页面。它首先在配置的静态内容位置中查找index.html文件。如果未找到,则查找index相关模板。如果找到任一,它将自动用作应用程序的欢迎页面。 2&…

Elasticsearch笔记

一、ElasticSearch概述 ElasticSearch(简称ES)是一个分布式、RESTful 风格的搜索引擎、数据分析引擎。ES底层是基于Apache Lucene搜索引擎库实现的,但是ES的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简…

Redisson实现简单消息队列:优雅解决缓存清理冲突

在项目中,缓存是提高应用性能和响应速度的关键手段之一。然而,当多个模块在短时间内发布工单并且需要清理同一个接口的缓存时,容易引发缓存清理冲突,导致缓存失效的问题。为了解决这一难题,我们采用Redisson的消息队列…

【MCU学习】RTthread工程介绍

RT-Thread架构 RT-Thread诞生于2006年,是一款以开源、中立、社区化发展起来的物联网操作系统。 RT-Thread主要采用 C 语言编写,浅显易懂,且具有方便移植的特性(可快速移植到多种主流 MCU 及模组芯片上)。RT-Thread把面…

cocosCreator 之 ScrollView

版本:3.4.0 参考:ScrollView组件 简介 ScrollView组件作为滚动容器来使用,它的实现通过ScrollBar组件来展示内容的位置和Mask组件显示指定区域,来保证有限的区域内显示更多的内容。 它的构成部分: ScrollBar滚动条相…

03 shell 编程

变量 语言型 编译型语言 解释型语言 shell脚本语言是解释型语言shell脚本的本质:shell命令的有序集合 shell 编程的基本过程 基本过程分为三步: step1. 建立 shell 文件 包含任意多行操作系统命令或shell命令的文本文件; step2. 赋予shell文件执行…

23 自定义控件

案例:组合Spin Box和Horizontal Slider实现联动 新建Qt设计师界面: 选择Widget: 选择类名(生成.h、.cpp、.ui文件) 在smallWidget.ui中使用Spin Box和Horizontal Slider控件 可以自定义数字区间: 在主窗口w…

脑电信号处理与特征提取——1. 脑电、诱发电位和事件相关电位(胡理)

目录 一、 脑电、诱发电位和事件相关电位 1.1 EEG基本知识 1.2 经典的ERPs成分及研究 1.2.1 ERPs命名规则及分类 1.2.2 常见的脑电成分 1.2.3 P300及Oddball范式 1.2.4 N400成分 一、 脑电、诱发电位和事件相关电位 1.1 EEG基本知识 EEG(Electroencephalogram)&#x…

MFC第二十天 数值型关联变量 和单选按钮与复选框的开发应用

文章目录 数值型关联变量数值型关联变量的种类介绍 单选按钮与复选框单选按钮的组内选择原理解析单选按钮和复选框以及应用数值型关联变量的开发CMainDlg.cppCInputDlg.hCInputDlg.cpp 附录 数值型关联变量 数值型关联变量的种类介绍 1、 数值型关联变量: a)控件型…

全志F1C200S嵌入式驱动开发(解决spi加载过慢的问题)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 之前的几个章节当中,我们陆续解决了spi-nor驱动的问题、uboot支持spi-nor的问题。按道理来说,下面要做的应该就是用uboot的loady命令把kernel、dtb、rootfs这些文件下载到ddr,然…

执行 yum install gcc 报 【-bash: $‘yum\302\240install\302\240gcc‘: 未找到命令】

执行 yum install gcc 报错 找了一圈,执行:sudo apt-get install yum 执行:wget http://yum.baseurl.org/download/3.2/yum-3.2.28.tar.gz 在线下载yum完成 对其进行解压:tar zxvf yum-3.2.28.tar.gz 解压后如下: 执行…

Tiny Player (js) - 轻量好用、免费开源的 web 视频播放开发组件,内置硬解、软解视频功能

一款简单好用的 JS 视频播放器,完美解决我遇到的移动端播放视频的需求,安利给各位。 关于 Tiny Player Tiny Player 是一个极简的视频播放器 JS 库,内置硬解、软解视频功能,支持原生控件样式以及自定义控件样式,小巧…

Android Service启动ANR原理

一、前言 在Service组件StartService()方式启动流程分析文章中,针对Context#startService()启动Service流程分析了源码,其实关于Service启动还有一个比较重要的点是Service启动的ANR,因为因为线上出现了上百例的"executing service &quo…

vue三级路由的写法

{path: "/trafficmanagement",component: Layout,redirect: "/trafficmanagement",alwaysShow: true,meta: {title: "通行模块",icon: "excel",},children: [{path: "carline",name: "carline",alwaysShow: true,…