如何创建沿两维度均值近似为0的32×10×1规格PyTorch矩阵
问题解决方法
你要生成的是满足双维度均值近似为0的正态分布噪声矩阵,不需要依赖numpy/scipy的特殊函数,纯PyTorch几行代码就能实现,生成的结果完全适配GAN训练的噪声要求。
核心思路
先生成标准正态分布的初始采样,再分别沿两个指定维度做平移居中,就能保证两个维度的均值数值上接近0(实际计算精度下均值在1e-7量级,完全满足"几乎为0"的要求)。居中操作仅对张量做整体平移,不会破坏原始采样的正态分布特性,不会影响GAN训练效果。
PyTorch实现代码
import torch # 生成初始32×10×1的标准正态采样 a = torch.randn(32, 10, 1) # 沿dim=0居中,保证该维度均值为0 a -= a.mean(dim=0, keepdim=True) # 沿dim=1居中,保证该维度均值为0 a -= a.mean(dim=1, keepdim=True) # 验证维度和均值 print(torch.mean(a, dim=0).shape) # 输出torch.Size([10, 1]),元素值均接近0 print(torch.mean(a, dim=1).shape) # 输出torch.Size([32, 1]),元素值均接近0
之前方法的问题说明
你之前调用torch.MultivariateNormal无法得到目标形状,是因为这个接口默认输出形状为[batch, 特征数]的二维张量,需要额外手动reshape,而且完全没必要特意构造多元正态协方差矩阵——GAN训练对噪声的要求仅为近似正态、对应维度均值为0,上述居中方法的实现成本更低,结果更可控。
Numpy等价实现
如果需要用numpy生成再转成PyTorch张量,逻辑完全一致:
import numpy as np import torch a = np.random.randn(32, 10, 1) a -= a.mean(axis=0, keepdims=True) a -= a.mean(axis=1, keepdims=True) a_tensor = torch.from_numpy(a)
注意:不要额外对采样做除以标准差的归一化操作,这类缩放会改变噪声的原始分布,反而可能影响GAN的训练稳定性,居中操作仅做平移,不会改变分布的方差属性,可以放心使用。
内容的提问来源于stack exchange,提问作者sidewala
相关产品推荐
相关产品推荐

