You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在IterableDataset上应用Min-Max Scaling?

处理IterableDataset下的Min-Max归一化方案

针对海量数据用IterableDataset时无法提前获取全量min/max的问题,给你几个实用的解决思路:

1. 全量遍历一次计算准确的min/max

虽然IterableDataset不存储全量数据,但可以单独遍历一次数据集,边遍历边实时更新全局的min和max,不需要把所有数据存入内存。

示例代码(PyTorch环境):

import torch
from torch.utils.data import IterableDataset

class MyIterableDataset(IterableDataset):
    def __init__(self, data_source):
        self.data_source = data_source
    
    def __iter__(self):
        for item in self.data_source:
            yield item

# 假设你的数据集实例
dataset = MyIterableDataset(your_large_data_source)

# 初始化min和max为极值
global_min = float('inf')
global_max = -float('inf')

# 遍历数据集更新min/max
for sample in dataset:
    # 假设sample是张量或数组,取当前样本的min和max
    current_min = torch.min(sample) if isinstance(sample, torch.Tensor) else sample.min()
    current_max = torch.max(sample) if isinstance(sample, torch.Tensor) else sample.max()
    global_min = min(global_min, current_min)
    global_max = max(global_max, current_max)

# 之后用这个global_min和global_max做归一化
def min_max_scale(sample):
    return (sample - global_min) / (global_max - global_min)

2. 用大样本估算min/max

如果全量遍历耗时太长,可以抽取足够大的随机样本(比如数据集的5%-10%),计算这个样本的min和max来近似全量的统计值。只要样本随机且规模足够,误差通常在可接受范围内,不会影响模型训练效果。

实现思路:

  • 遍历数据集时,随机抽取一定比例的样本存入内存(确保内存能承载)
  • 计算这批样本的min和max,用它作为全量的近似值进行归一化

3. 在线动态更新归一化参数

训练过程中实时更新min和max,一开始归一化结果可能有偏差,但随着模型训练的推进,参数会逐渐收敛到真实的全量统计值。可以用移动平均的方式更新,避免单次样本的波动影响:

示例代码片段:

# 初始化参数
running_min = float('inf')
running_max = -float('inf')
momentum = 0.9  # 移动平均系数

for epoch in range(num_epochs):
    for sample in dataset:
        current_min = sample.min()
        current_max = sample.max()
        # 移动平均更新
        running_min = momentum * running_min + (1 - momentum) * current_min
        running_max = momentum * running_max + (1 - momentum) * current_max
        # 用当前的running参数做归一化
        scaled_sample = (sample - running_min) / (running_max - running_min)
        # 后续训练步骤...

4. 硬编码已知的数据范围

如果你的数据集本身有明确的取值范围(比如图像数据的像素值范围是0-255、传感器数据的量程已知),直接用这个已知的min和max做归一化即可,完全不需要计算。


内容的提问来源于stack exchange,提问作者Saffy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 12:47:04