【SegRNN 源码理解】self.revIN可逆实例标准化

python 复制代码
       if self.revin: #self.revin =  1  (休止符)
            x = self.revinLayer(x, 'norm').permute(0, 2, 1) # b,s,c -> b,c,s # goto 

也是一种标准化

  1. 是什么
  2. 两次标准化
  3. 分布偏移
  4. 实例归一化

实例归一化

分布偏移

计算方法

python 复制代码
# 归一化步骤
x = (x - mean) / std  # 消除分布偏移

# 在预测后的反归一化步骤
y = y * std + mean  # 恢复原始数据分布

RevIN的工作原理:

  1. 实例级归一化

    • 不同于全局标准化,RevIN对每个输入序列单独计算统计量
    • 针对每个通道(特征)分别处理
  2. 可逆设计

    • 保存归一化参数(均值和标准差)
    • 允许在预测后"反归一化",恢复原始数据分布的特性
  3. 保留模式而消除分布

    • 消除绝对水平和尺度的影响
    • 让模型专注于学习序列的相对变化模式

举例说明:

假设有两个季节的疾病数据,夏季感染率在0-10范围,冬季在50-60范围:

应用RevIN后:

是什么

这段代码完成两个关键操作:

1. 数据归一化处理 (RevIN)

self.revinLayer(x, 'norm') 调用了 RevIN (Reversible Instance Normalization) 层对输入数据进行归一化:

  • RevIN 是什么:一种专为时间序列设计的可逆归一化技术,可以处理非平稳时间序列中的分布偏移问题

  • 工作原理:对每个实例(样本)的每个通道分别进行归一化

  • 为什么需要:与数据加载时的全局标准化不同,RevIN 对每个序列单独归一化,处理序列内部的分布变化

  • 可逆特性:RevIN 保存归一化参数,在模型输出时可以"反归一化",恢复原始分布

2. 维度变换 (permute)

.permute(0, 2, 1) 改变了张量的维度顺序:

  • 输入形状 :[batch_size, seq_len, channels] 简写为 [b, s, c]

    • 例如 [16, 60, 7]:16个样本,每个60个时间步,每个时间步7个特征
  • 输出形状 :[batch_size, channels, seq_len] 即 [b, c, s]

    • 变为 [16, 7, 60]:16个样本,7个特征通道,每个通道60个时间步
  • 变换目的

    1. 将特征/通道维度提到第二维,便于后续按通道处理数据
    2. 为分段操作做准备,让时间维度在最后,便于后续分段处理
    3. 符合许多深度学习库的惯例,如卷积操作通常期望通道在第二维

更具体的例子:16 个批次,60 个时间步,每个时间步 7 个特征

全局标准化

相关推荐
普贤莲花18 小时前
【2026年第11周---写于20260322】
程序人生·算法·leetcode
小白自救计划18 小时前
力扣知识点杂集
算法·leetcode·哈希算法
阿贵---18 小时前
分布式系统C++实现
开发语言·c++·算法
不染尘.18 小时前
最短路径之Bellman-Ford算法
开发语言·数据结构·c++·算法·图论
big_rabbit050218 小时前
JVM堆内存查看命令
java·linux·算法
m0_6625779718 小时前
C++中的RAII技术深入
开发语言·c++·算法
旖-旎18 小时前
二分查找(点名)(8)
c++·算法·二分查找·力扣
承渊政道18 小时前
【优选算法】(实战体验滑动窗口的奇妙之旅)
c语言·c++·笔记·学习·算法·leetcode·visual studio
lemonth18 小时前
图形推理----
人工智能·算法·机器学习
2401_8914821718 小时前
C++代码复杂性分析
开发语言·c++·算法