if self.revin: #self.revin = 1 (休止符)x = self.revinLayer(x, 'norm').permute(0, 2, 1) # b,s,c -> b,c,s # goto
也是一种标准化
- 是什么
- 两次标准化
- 分布偏移
- 实例归一化
实例归一化
分布偏移
计算方法
# 归一化步骤
x = (x - mean) / std # 消除分布偏移# 在预测后的反归一化步骤
y = y * std + mean # 恢复原始数据分布
RevIN的工作原理:
-
实例级归一化:
- 不同于全局标准化,RevIN对每个输入序列单独计算统计量
- 针对每个通道(特征)分别处理
-
可逆设计:
- 保存归一化参数(均值和标准差)
- 允许在预测后"反归一化",恢复原始数据分布的特性
-
保留模式而消除分布:
- 消除绝对水平和尺度的影响
- 让模型专注于学习序列的相对变化模式
举例说明:
假设有两个季节的疾病数据,夏季感染率在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个时间步
- 变为
-
变换目的:
- 将特征/通道维度提到第二维,便于后续按通道处理数据
- 为分段操作做准备,让时间维度在最后,便于后续分段处理
- 符合许多深度学习库的惯例,如卷积操作通常期望通道在第二维
更具体的例子:16 个批次,60 个时间步,每个时间步 7 个特征
全局标准化