nn.conv1d计算过程

news/2025/3/31 4:31:42/文章来源:https://www.cnblogs.com/saulstavo/p/18797204

下面我们用一个具体的数字例子,从输入到输出一步步说明 Conv1d 是如何计算的。假设你有一条时间序列数据,其形状为

(batch*ts_d, seg_num, d_model) = (1*1, 4, 3)

(为了方便,我们这里设 batch*ts_d=1,即只有一个样本;seg_num=4 表示有 4 个分块,d_model=3 表示每个分块有 3 个特征。)
转置后,数据会变成形状

(1, d_model, seg_num) = (1, 3, 4)

也就是说,每个样本有 3 个通道,每个通道有 4 个时序位置。假设这 3 个通道的数据如下:

  • 通道 0(特征 1):[1, 2, 3, 4]
  • 通道 1(特征 2):[5, 6, 7, 8]
  • 通道 2(特征 3):[9, 10, 11, 12]

我们选用一个 Conv1d 层,参数如下:

  • in_channels = 3(输入通道数,即 d_model)
  • out_channels = 2(输出通道数,我们随便设成 2)
  • kernel_size = 3
  • stride = 1
  • padding = 1(为了保持输出长度与输入长度相同)

这样,Conv1d 内部会有 2 个卷积核,每个卷积核的大小为

(in_channels, kernel_size) = (3, 3)

此外,每个卷积核还对应一个偏置。

我们来指定这两个卷积核的权重和偏置为例(数字只是举例,实际训练中会随机初始化):

卷积核权重和偏置

输出通道 0 的卷积核权重:

  • 对应通道 0 的权重:[1, 0, -1]
  • 对应通道 1 的权重:[2, 1, 0]
  • 对应通道 2 的权重:[0, -1, -2]

偏置:1

输出通道 1 的卷积核权重:

  • 对应通道 0 的权重:[0, 1, 0]
  • 对应通道 1 的权重:[1, 0, -1]
  • 对应通道 2 的权重:[2, -1, 0]

偏置:0

由于我们设置了 padding=1,输入在序列两端会自动填充 0。例如,对于序列长度为 4 的数据,填充后实际序列索引变成:索引 -1、0、1、2、3、4,其中索引 -1 和 4 都为 0。

接下来,我们计算每个输出位置的值。注意:卷积核在每个时刻取连续 3 个位置的数据(kernel_size=3),计算公式为:
[
\text{输出} = \sum_{\text{通道}=0}{2}\sum_{k=0} (\text{输入}[c, i+k-\text{padding}] \times \text{权重}[c, k]) + \text{偏置}
]

计算过程

【输出通道 0】

  1. 位置 i = 0
    卷积窗口覆盖输入索引:-1、0、1

    • 对通道 0:
      数据:[0(填充), 1, 2]
      权重:[1, 0, -1]
      计算:0*1 + 1*0 + 2*(-1) = 0 + 0 - 2 = -2
    • 对通道 1:
      数据:[0, 5, 6]
      权重:[2, 1, 0]
      计算:0*2 + 5*1 + 6*0 = 0 + 5 + 0 = 5
    • 对通道 2:
      数据:[0, 9, 10]
      权重:[0, -1, -2]
      计算:0*0 + 9*(-1) + 10*(-2) = 0 - 9 - 20 = -29

    总和: -2 + 5 - 29 = -26,再加上偏置 1,得到 -25

  2. 位置 i = 1
    卷积窗口覆盖索引:0、1、2

    • 通道 0:
      数据:[1, 2, 3]
      权重:[1, 0, -1]
      计算:1*1 + 2*0 + 3*(-1) = 1 + 0 - 3 = -2
    • 通道 1:
      数据:[5, 6, 7]
      权重:[2, 1, 0]
      计算:5*2 + 6*1 + 7*0 = 10 + 6 + 0 = 16
    • 通道 2:
      数据:[9, 10, 11]
      权重:[0, -1, -2]
      计算:9*0 + 10*(-1) + 11*(-2) = 0 - 10 - 22 = -32

    总和: -2 + 16 - 32 = -18,加偏置 1,得到 -17

  3. 位置 i = 2
    卷积窗口覆盖索引:1、2、3

    • 通道 0:
      数据:[2, 3, 4]
      权重:[1, 0, -1]
      计算:2*1 + 3*0 + 4*(-1) = 2 + 0 - 4 = -2
    • 通道 1:
      数据:[6, 7, 8]
      权重:[2, 1, 0]
      计算:6*2 + 7*1 + 8*0 = 12 + 7 + 0 = 19
    • 通道 2:
      数据:[10, 11, 12]
      权重:[0, -1, -2]
      计算:10*0 + 11*(-1) + 12*(-2) = 0 - 11 - 24 = -35

    总和: -2 + 19 - 35 = -18,加偏置 1,得到 -17

  4. 位置 i = 3
    卷积窗口覆盖索引:2、3、4(索引4为填充0)

    • 通道 0:
      数据:[3, 4, 0]
      权重:[1, 0, -1]
      计算:3*1 + 4*0 + 0*(-1) = 3 + 0 + 0 = 3
    • 通道 1:
      数据:[7, 8, 0]
      权重:[2, 1, 0]
      计算:7*2 + 8*1 + 0*0 = 14 + 8 + 0 = 22
    • 通道 2:
      数据:[11, 12, 0]
      权重:[0, -1, -2]
      计算:11*0 + 12*(-1) + 0*(-2) = 0 - 12 + 0 = -12

    总和: 3 + 22 - 12 = 13,加偏置 1,得到 14

因此,输出通道 0 得到的结果序列为:

[-25, -17, -17, 14]

【输出通道 1】

同理,我们用输出通道 1 的权重和偏置来计算。

  1. 位置 i = 0(窗口索引 -1、0、1)

    • 通道 0:
      数据:[0, 1, 2]
      权重:[0, 1, 0]
      计算:0*0 + 1*1 + 2*0 = 0 + 1 + 0 = 1
    • 通道 1:
      数据:[0, 5, 6]
      权重:[1, 0, -1]
      计算:0*1 + 5*0 + 6*(-1) = 0 + 0 - 6 = -6
    • 通道 2:
      数据:[0, 9, 10]
      权重:[2, -1, 0]
      计算:0*2 + 9*(-1) + 10*0 = 0 - 9 + 0 = -9

    总和: 1 - 6 - 9 = -14(偏置为 0)。

  2. 位置 i = 1(窗口索引 0、1、2)

    • 通道 0:
      数据:[1, 2, 3]
      权重:[0, 1, 0]
      计算:1*0 + 2*1 + 3*0 = 0 + 2 + 0 = 2
    • 通道 1:
      数据:[5, 6, 7]
      权重:[1, 0, -1]
      计算:5*1 + 6*0 + 7*(-1) = 5 + 0 - 7 = -2
    • 通道 2:
      数据:[9, 10, 11]
      权重:[2, -1, 0]
      计算:9*2 + 10*(-1) + 11*0 = 18 - 10 + 0 = 8

    总和: 2 - 2 + 8 = 8

  3. 位置 i = 2(窗口索引 1、2、3)

    • 通道 0:
      数据:[2, 3, 4]
      权重:[0, 1, 0]
      计算:2*0 + 3*1 + 4*0 = 0 + 3 + 0 = 3
    • 通道 1:
      数据:[6, 7, 8]
      权重:[1, 0, -1]
      计算:6*1 + 7*0 + 8*(-1) = 6 + 0 - 8 = -2
    • 通道 2:
      数据:[10, 11, 12]
      权重:[2, -1, 0]
      计算:10*2 + 11*(-1) + 12*0 = 20 - 11 + 0 = 9

    总和: 3 - 2 + 9 = 10

  4. 位置 i = 3(窗口索引 2、3、4,其中索引4为0)

    • 通道 0:
      数据:[3, 4, 0]
      权重:[0, 1, 0]
      计算:3*0 + 4*1 + 0*0 = 0 + 4 + 0 = 4
    • 通道 1:
      数据:[7, 8, 0]
      权重:[1, 0, -1]
      计算:7*1 + 8*0 + 0*(-1) = 7 + 0 + 0 = 7
    • 通道 2:
      数据:[11, 12, 0]
      权重:[2, -1, 0]
      计算:11*2 + 12*(-1) + 0*0 = 22 - 12 + 0 = 10

    总和: 4 + 7 + 10 = 21

因此,输出通道 1 得到的结果序列为:

[-14, 8, 10, 21]

最终输出

经过 Conv1d 之后,一个样本的输出就变成了两个通道,每个通道 4 个数,即输出形状为

(1, out_channels, seg_num) = (1, 2, 4)

如果你的 batch*ts_d > 1,那么同样的计算会独立作用于每个样本。最终,经过转置(如果需要恢复到原始格式)后,数据的形状会根据模型需要做相应调整。


这个例子展示了如何将输入的每个“分块序列”(seg_num 个时刻,每个时刻 d_model 个特征)利用大小为 3 的卷积核滑动计算,得到新的特征表示。希望通过具体的数字计算,你能更直观地理解 Conv1d 的操作过程。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图床图片上传工具-图传

原文:https://ichochy.com/posts/app/20250325.html时隔多年,又重新出发,从零开始,在 AI 的加持下,再次开发这个图床图片上传工具。爆肝数日,基本完成这个软件现有功能。实现了图片资源的上传、分享、和管理等功能。图传 是一个免费开源的图床图片上传工具。 是一款为 ma…

Linux上利用sunshine串流和虚拟显示器实现副屏扩展

场景Linux + Wayland,尝试将空闲的android平板作为扩展显示屏方法根据 https://www.w568w.eu.org/spacedesk-on-linux.html 中的描述,利用 sunshine + moonlight 串流以及虚拟显示器欺骗实现副屏扩展虚拟显示器查看当前系统记录的显示器设备接口的连接情况,使用命令for p in…

Go红队开发—CLI框架(二)

Go红队开发—CLI命令行工具编写基础学习(二)。目录CLI开发框架cobra 集成库目录规范搭建框架根命令参数添加子命令帮助信息爬虫功能(趁热打铁)Goquery处理响应编码处理收集百度热搜榜爬虫功能所有源码 CLI开发框架 师傅们久等了,为了加快进度,这章节添加了一个爬虫功能,也是…

APP性能测试工具-GT

GT(随身调)是腾讯研发的一款可以用来做App性能测试的工具,可以对APP进行快速的性能测试,检测App的CPU、内存、流量、电量、帧率/流畅度等等、还能开启日志的查看、Crash日志查看、网络数据包的抓取、APP内部参数的调试、真机代码耗时统计等。 虽然现在该项目已经停止维护了…

一文速通Python并行计算:04 Python多线程编程-多线程同步(上)—基于条件变量、事件和屏障

本文介绍了Python多线程同步的三种机制:条件变量(Condition)、事件(Event)和屏障(Barrier),条件变量指的是线程等待特定条件满足后执行,适用于生产者-消费者模型;Event指的是线程通过事件标志进行同步,适用于线程间简单通信;Barrier指的是多个线程需同步到同一阶段…

docker desktop windows安装

我的机器windows 11 家庭版 下载docker desktop for windows 就直接安装了。安装后打开,遇到了界面转圈圈加载不出来问题,docker engine也是stopped. 病急乱投医,先是说要启用hyper-v,控制面板=》程序和功能里没有发现有hyper-v,一看是家庭版,网上倒是有一个脚本可以在家…

C语言打卡学习第6天(2025.3.25)(补发)

只做了一些有关循环分支函数求值的题,感觉循环函数其实差不多,只有一些细微差别,可能是做的题还不够多或者看运用场景吧

C语言打卡学习第5天(2025.3.24)(补发)

1、把char,getchar,putchar简单看了一下,求ascii值之类的 之类的简单看了一下 2、交换值那一题很奇怪,结果我输出的跟答案要求是一样的,交过去之后显示答案错误,白天的时候问一下

Vulnstack红日靶场通关(持续更新)

带你速通内网渗透相关知识点!!!Vulnstack通关 来源于《内网渗透实战攻略》实战部分 个人是写下自己的笔记 攻击链:探索发现阶段->入侵和感染阶段->攻击和利用阶段->探索感知阶段->传播阶段->持久化和恢复阶段 Windows权限级别前置知识:权限层级 账户类型 权…

Ubuntu 24.04安装MySQL,并且配置外网访问

安装启动更新软件包列表sudo apt update安装MySQL软件包sudo apt install mysql-server启动MySQL服务sudo systemctl start mysql重启命令:systemctl restart mysql配置外网访问 需要修改一个配置 vim /etc/mysql/mysql.conf.d/mysqld.cnf注释掉 这行 配置 bind-address …

2022CCPC Online Contest G - Name the Puppy

对正串和反串分别建立 Trie 树,定义 \(dp[i][j]\) 表示正串 Trie 树上编号为 \(i\) 的点匹配反串 Trie 树上编号为 \(j\) 的点所能拼出最长 anti-border 的长度。 如此,从根节点开始搜索,直到无法匹配为止都可以搜,搜到底后回到根节点继续匹配,可以证明,拼出来的 anti-bo…

互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp智能体框架开发语音交互

前言 前段时间太忙了博客一直都没来得及更新,但是不代表我已经停止开发了,刚好最近把语音部分给调整了一下,所以就来分享一下具体的内容了。我想说一下,更新晚还是有好处的,社区已经有很多的小伙伴自己实现了一些语音对话功能的案例,比如小智也有.NET客户端了,还有就是一…