如何用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
相关产品推荐
相关产品推荐

