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

如何用PyTorch Transform优雅实现一维向量标准化?

一维PyTorch张量标准化(均值0、标准差1)的优雅实现

问题背景

处理基于PyTorch的一维信号数据集时,需要将向量标准化为均值0、标准差1。处理图像数据时可通过torchvision.transforms.Normalize实现,示例代码如下:

import torchvision.transforms as transforms
import torch

data_2d = torch.rand(1, 100, 100)
normalized_data_2d = transforms.Normalize(mean=(data_2d.mean(),), std=(data_2d.std(),))(data_2d)
print(f'mean: {normalized_data_2d.mean()} ~ 0 , std: {normalized_data_2d.std()} ~ 1, ok')

运行结果:

mean: -4.1373571235681084e-08 ~ 0 , std: 0.9999999403953552 ~ 1, ok

但用同样方式处理一维数据时:

data_1d = torch.rand(100)
normalized_data_1d = transforms.Normalize(mean=(data_1d.mean(),), std=(data_1d.std(),))(data_1d)

会抛出错误:TypeError: Tensor is not a torch image。

原因分析

torchvision.transforms.Normalize是为图像数据设计的,要求输入张量至少为3维(通道数C、高度H、宽度W),一维张量不满足该维度要求,因此报错。

优雅实现方式

方式1:手动实现标准化(最直接)

transforms.Normalize的本质就是执行(x - mean) / std,手动实现无需依赖torchvision,更适合一维场景:

import torch

data_1d = torch.rand(100)
mean = data_1d.mean()
std = data_1d.std()
normalized_data_1d = (data_1d - mean) / std

# 验证结果
print(f'mean: {normalized_data_1d.mean():.10f} ~ 0, std: {normalized_data_1d.std():.10f} ~ 1')

方式2:调整张量维度适配torchvision

如果一定要用torchvision.transforms.Normalize,可以先将一维张量调整为符合图像格式的3维张量,处理后再恢复维度:

import torch
import torchvision.transforms as transforms

data_1d = torch.rand(100)
# 重塑为(通道数C, 1, 长度L)的3维格式
data_reshaped = data_1d.reshape(1, 1, -1)
# 执行标准化
normalized_data = transforms.Normalize(mean=(data_reshaped.mean(),), std=(data_reshaped.std(),))(data_reshaped)
# 恢复为一维张量
normalized_data_1d = normalized_data.squeeze()

# 验证结果
print(f'mean: {normalized_data_1d.mean():.10f} ~ 0, std: {normalized_data_1d.std():.10f} ~ 1')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 21:56:05