【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 个特征

全局标准化

相关推荐
Swift社区1 分钟前
LeetCode 456 - 132 模式
java·算法·leetcode
LYFlied2 分钟前
【每日算法】LeetCode 152. 乘积最大子数组(动态规划)
前端·算法·leetcode·动态规划
爱学大树锯15 分钟前
【(格式化字符串)】
算法
wearegogog12315 分钟前
压缩感知和稀疏表示恢复算法中的L1同伦算法
人工智能·算法
core51220 分钟前
决策树 (Decision Tree):像“猜猜看”游戏一样的AI算法
人工智能·算法·决策树
xa1385086939 分钟前
ARCGIS PRO SDK 多边形四至点计算
算法·arcgis
AuroraWanderll1 小时前
类和对象(四):默认成员函数详解与运算符重载(下)
c语言·数据结构·c++·算法·stl
2401_841495641 小时前
【LeetCode刷题】杨辉三角
数据结构·python·算法·leetcode·杨辉三角·时间复杂度·空间复杂度
Tim_101 小时前
【算法专题训练】35、前缀树查找
算法
LYFlied1 小时前
【每日算法】LeetCode 62. 不同路径(多维动态规划)
前端·数据结构·算法·leetcode·动态规划