【问题标题】:How do I create a normal distribution in pytorch?如何在pytorch中创建正态分布
【发布时间】:2018-12-10 16:56:11
【问题描述】:

我想在 pytorch 中创建一个随机正态分布,mean 和 std 分别为 4、0.5。我没有找到它的API。有谁知道?非常感谢。

【问题讨论】:

  • 查看所有发行版的内容(这样您就可以执行r2 = torch.torch.distributions.Uniform(low=lb, high=ub).sample((num_samples,Din)) 之类的操作):pytorch.org/docs/stable/…

标签: python statistics pytorch linear-algebra normal-distribution


【解决方案1】:

您可以像文档中描述的here 那样创建您的发行版。 在您的情况下,这应该是正确的调用,包括从创建的分布中采样:

from torch.distributions import normal

m = normal.Normal(4.0, 0.5)
s = m.sample()

如果你想获取某种尺寸/形状的样品,可以pass it to sample(),例如

s = m.sample([5, 5])

对于 5x5-Tensor。

【讨论】:

  • 如果您想取样特定尺寸怎么办?
【解决方案2】:

所有分发请参见:https://pytorch.org/docs/stable/distributions.html#

点击右侧菜单跳转到正常(或在文档中搜索)。

示例代码:

import torch

num_samples = 3
Din = 1
mu, std = 0, 1
x = torch.distributions.normal.Normal(loc=mu, scale=std).sample((num_samples, Din))

print(x)

有关火炬分布的详细信息(重点是制服),请参阅我的 SO 答案:https://stackoverflow.com/a/62919760/1601580

【讨论】:

    【解决方案3】:

    这取决于你想要生成什么。

    用于生成标准正态分布使用 -

    torch.randn()
    

    对于所有分布(比如正态分布、泊松分布或均匀分布等)使用 torch.distributions.Normal()torch.distribution.Uniform()。 所有这些方法的细节可以在这里看到 - https://pytorch.org/docs/stable/distributions.html#normal

    一旦定义了这些方法,您就可以使用 .sample 方法来生成实例数。如果分布参数是批处理的,它还允许您生成 sample_shape 形状的样本或 sample_shape 形状的批次样本。

    【讨论】:

      【解决方案4】:

      您可以轻松使用torch.Tensor.normal_() 方法。

      让我们创建一个维度为1 × 5 的矩阵Z(一维张量),其中填充来自mean = 4std = 0.5 参数化的正态分布的随机元素样本。

      torch.empty(5).normal_(mean=4,std=0.5)
      

      结果:

      tensor([4.1450, 4.0104, 4.0228, 4.4689, 3.7810])
      

      【讨论】:

      • 为什么如果我计算你发布的向量的标准和平均值,我得到:(tensor(4.0856), tensor(0.2514))?标准差不是应该接近 0.5 吗?
      【解决方案5】:

      对于标准正态分布(即mean=0variance=1),您可以使用torch.randn()

      对于您自定义meanstd 的情况,您可以使用torch.distributions.Normal()


      初始化签名:
      tdist.Normal(loc, scale, validate_args=None)

      文档字符串:
      创建参数化的正态(也称为高斯)分布 locscale

      参数:
      loc (float or Tensor): 分布的均值(通常称为 mu)
      scale (float or Tensor): 分布的标准差 (通常称为 sigma)


      这是一个例子:

      In [32]: import torch.distributions as tdist
      
      In [33]: n = tdist.Normal(torch.tensor([4.0]), torch.tensor([0.5]))
      
      In [34]: n.sample((2,))
      Out[34]: 
      tensor([[ 3.6577],
              [ 4.7001]])
      

      【讨论】:

        【解决方案6】:

        一个简单的选择是使用基本模块中的randn 函数。它从标准高斯分布中创建一个随机样本。要更改平均值和标准差,您只需使用加法和乘法即可。下面我根据您要求的分布创建大小为 5 的样本。

        import torch
        torch.randn(5) * 0.5 + 4 # tensor([4.1029, 4.5351, 2.8797, 3.1883, 4.3868])
        

        【讨论】:

        • 您好,我发现以下内容令人困惑:根据 PyTorch 文档:torch.rand 返回一个张量,其中填充了区间 [0,1) pytorch.org/docs/stable/torch.html#torch.rand 上均匀分布的随机数。我看到一些开发人员使用与您相同的代码来创建高斯分布。如果您能进一步详细说明,我将不胜感激?谢谢
        • @Zvezda 我不确定你的问题是什么。 rand 函数确实从均匀分布中采样,但 randn 函数从高斯 pytorch.org/docs/stable/torch.html#torch.randn 中采样。乘以标准差并加上平均值是标准的统计实践。
        • 您好,@gui11aume,非常感谢。我意识到我没有注意到这两个是两个不同的函数 - rand 和 randN。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-25
        • 1970-01-01
        • 1970-01-01
        • 2020-12-18
        • 2020-07-01
        • 2021-10-31
        相关资源
        最近更新 更多