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

【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个段作为时间步输入

明天看解码过程


http://www.kler.cn/a/579413.html

相关文章:

  • [java][OAuth2.0]OAuth2.0建表语句
  • 如何使用 GPT-4o 翻译播客声音
  • AI编程: 一个案例对比CPU和GPU在深度学习方面的性能差异
  • Nginx开启目录浏览功能时加密码的方法
  • Java 解决 TCP 粘包问题详解:原理与实战示例
  • 【flutter】TextField输入框工具栏文本为英文解决(不用安装插件版本
  • 爬虫案例十js逆向合肥滨湖会展中心网
  • 【大模型基础_毛玉仁】1.4 语言模型的采样方法
  • mac本地安装运行Redis-单机
  • 【前端】【组件】【vue2】封装一个vue2的ECharts组件,不用借助vue-echarts
  • MySQL创建数据库和表,插入四大名著中的人物
  • 深度学习与普通神经网络有何区别?
  • Ai大模型day02神经网络+深度学习
  • Agentic系统:负载均衡与Redis缓存优化
  • 刷题记录(LeetCode738 单调递增的数字)
  • Web3 的隐私保护机制:如何保障个人数据安全
  • Redis渐进式遍历数据库
  • rpc和proto
  • 【YOLOv12改进trick】多尺度大核注意力机制MLKA模块引入YOLOv12,实现多尺度目标检测涨点,含创新点Python代码,方便发论文
  • 手写Tomcat:实现基本功能