当前位置: 首页 > news >正文

【SegRNN 源码理解】【今天不水文系列】编码器部分理解

我来小小的理解一下:

首先,16 batchsize,60sequendcelength,7 个特征的通俗解释

16 个独立的样本,每个样本有 60 个连续的时间步及对应的标签值,每个时间步有 60 个特征

所以就是因为样本是随机从训练集中采的,所以就假设采的是

样本 1,样本 6,样本 109,样本 334,样本 354等等等,一共 16 个(这就是 batchsize,表示一个 batch中容纳的样本数)

接下来,每个样本中连续的 60 个时间步,这个就很好理解了,但是这 60 个连续的时间步:

(0)样本 1:可能从第 7 个时间开始.....跟着 60 个,后面紧跟着要预测的 24 个时间步,dataloader 读数据时都封装好了,会对应上的

(1)样本 6:从第  38 个时间开始.....

(2)样本109:从第 1 个时间开始

......

(15)样本 334:从第 129 个时间开始

总之就是这样,然后每个时间有 7 个特征表示

接下来 16x60x7 --》 16×7×60

就是:

(0)样本 1:特征 1[60个连续的时间步],特征 2,特征 3,,,,,特征 7

(1)样本 6:特征 1,特征 2,特征 3,,,,,特征 7

(2)样本109:特征 1,特征 2,特征 3,,,,,特征 7

......

(15)样本 334:特征 1,特征 2,特征 3,,,,,特征 7

每个特征分别有 60 个连续的时间步

接下来呢,又开始对于这 60 个时间步,分段,分成 5 段,每段 12 个

然后呢,就把分出来的 段,12 维 统统喂到 linear 中,嵌入到 512 维,用的一个嵌入空间,所以嵌入时使用权值矩阵是一样的,毕竟得在同一个准则下才有可比性,这一步就是学习了每一个小段内,时间之间的相关关系

代码中搞事情:

它把样本batch 维度和特征维度,混到一起写,reshape 成(-1,seg_num_x,seg_dim)


(0)样本 1-特征 1 :【12】【12】【12】【12】【12】

(0)样本 1-特征 2 :【12】【12】【12】【12】【12】

....

(0)样本 1-特征 7 :【12】【12】【12】【12】【12】


(1)样本 6-特征 1 :【12】【12】【12】【12】【12】

(1)样本 6-特征 2 :【12】【12】【12】【12】【12】

....

(1)样本 6-特征 7 :【12】【12】【12】【12】【12】


(15)样本 334-特征 1 :【12】【12】【12】【12】【12】

(15)样本 334-特征 2 :【12】【12】【12】【12】【12】

....

(15)样本 334-特征 7 :【12】【12】【12】【12】【12】


也就是 112 条序列、、、 112×5×12

linear 就是把所有的 12 全部嵌入到 512 维

112×5×512


(0)样本 1-特征 1 :【512】【512】【512】【512】【512】→ 5步GRU → hn[0,0]

(0)样本 1-特征 2 :【512】【512】【512】【512】【512】→ 5步GRU → hn[0,1]

....

(0)样本 1-特征 7 :【512】【512】【512】【512】【512】→ 5步GRU → hn[0,6]


(1)样本 6-特征 1 :【512】【512】【512】【512】【512】→ 5步GRU → hn[0,7]

(1)样本 6-特征 2 :【512】【512】【512】【512】【512】→ 5步GRU → hn[0,8]

....

(1)样本 6-特征 7 :【512】【512】【512】【512】【512】


(15)样本 334-特征 1 :【512】【512】【512】【512】【512】

(15)样本 334-特征 2 :【512】【512】【512】【512】【512】

....

(15)样本 334-特征 7 :【512】【512】【512】【512】【512】→ 5步GRU → hn[0,111]


接下来 段内建模完了,那相邻段之间的时间的关系还没有建模呀,就把这些统统喂到 RNN 中,

RNN 把这个当做 5 个时间步,112 当成新的 batch,RNN 的 hiddensize 也设置成了 512(源码中写了),也就是 

单层 GRU(文中实际上用的 RNN 单元)

[序列 1] → 5步GRU → hn[0,0]
[序列 2] → 5步GRU → hn[0,1]
...
[序列 8] → 5步GRU → hn[0,7]
...
[序列 112] → 5步GRU → hn[0,111]

实际上这个 hn 应该是三维的,毕竟输入就是三维的,h_n.shape=1×112×512

应该是:

[序列 1] → hn[0, 0, :] - 批次0-特征0的最终隐藏状态
[序列 2] → hn[0, 1, :] - 批次0-特征1的最终隐藏状态
...
[序列 8] → hn[0, 7, :] - 批次1-特征0的最终隐藏状态
...
[序列 112] → hn[0, 111, :] - 批次15-特征6的最终隐藏状态

如果模型使用了多层GRU(例如num_layers=2),则隐藏状态的第一维将为2,我们会有:

  • hn[0,i,:] - 第一层GRU对序列i的最终隐藏状态
  • hn[1,i,:] - 第二层GRU对序列i的最终隐藏状态

但我们的num_layers=1

笑死,看了一天,居然觉得这么做也没啥不好的,习惯这个有点反常识的表示了。

传统 RNN 是:

16×60×7,其实就是:

(1)样本 6:从第  38 个时间开始..... → 60步GRU 建模  7 维 →hn[0,0] 512 维(融合了所有时间步信息的 512 维)

(2)样本109:从第 1 个时间开始→ 60步GRU 建模  7 维→ hn[0,1] 512 维

......

(15)样本 334:从第 129 个时间开始→ 60步GRU → hn[0,15] 512 维 

解码的时候还原,其实是一样的

  • 16个样本确实是随机采样的,不一定是连续的样本
  • 每个样本的60个时间步确实是连续的时间序列片段
  • 不同样本可以从各自时间序列的不同位置开始
  • "嵌入时使用权值矩阵是一样的,毕竟得在同一个准则下才有可比性"
  • RNN把5个段作为5个时间步处理
  • 每个序列有自己独立的隐藏状态流
  • 所有序列共享同一个RNN的参数
  • 第一个维度0表示GRU层索引(因为只有1层)
  • 第二个维度i表示112个序列中的第i个
  • 第三个维度表示512维隐藏状态
  • 传统RNN: 每个批次作为一个整体,60个时间步直接输入
  • SegRNN: 每个批次-特征组合作为独立序列,5个段作为时间步输入

明天看解码过程

相关文章:

  • 云曦春季开学考复现(2025)
  • Linux基础--进程管理
  • 博弈是达到均衡状态的简单理解
  • 【网络】HTTP协议、HTTPS协议
  • PyTorch系列教程:编写高效模型训练流程
  • go的grpc
  • 视觉 Yolov11 环境配置(GPU版)
  • 使用websocket,注入依赖service的bean为null
  • golang从入门到做牛马:第四篇-Go语言基础语法
  • C++20 模块:告别头文件,迎接现代化的模块系统
  • hyperlane使用SSE实现服务端主动推送
  • 【0013】Python数据类型-列表类型详解
  • 详解常用集合和映射中的线程安全问题
  • 练习题:74
  • svn删除所有隐藏.svn文件,文件夹脱离svn控制
  • 第九章:把函数当变量传递,匿名函数、闭包、panic/recover
  • 背包九讲
  • 全自动数据强制备份程序,无视占用直接硬复制各种数据文件、文档、音视频、软件、数据库等的VSS卷拷贝批处理脚本程序,解放双手,一劳永逸
  • el-table一格两行;概率;find
  • 每日一题——搜索二维矩阵
  • 汕头建设网站的公司/专业网站建设公司首选
  • 淄博网站建设 熊掌号/b站推广网站2024mmm
  • b站不收费观看/怎么制作网站平台
  • 权4网站怎么做/北京网站优化对策
  • 做外贸电商网站/网络营销八大职能
  • 企业酒店的网站建设/童程童美少儿编程怎样收费