【pytorch】normal函數的詳細使用和常見錯誤


normal函數的詳細使用和常見錯誤

1.normal(mean, std, *, generator=None, out=None)

  • 返回值:一個張量,張量中每個元素是從相互獨立的正態分布中隨機生成的。每個正態分布的均值和標准差對應着mean中的一個值和std中的一個值
  • 參數
    • mean(tensor):是一個張量,存儲着輸出張量中每個元素正態分布的均值
    • std(tensor):是一個張量,存儲着輸出張量中每個元素正態分布的標准差
    • 注意:張量mean和std的形狀不一定相同,但是元素個數必須相同。如果二者形狀不一致,返回張量的形狀和mean的一致
    • generator=None:用於采樣的偽隨機數發生器
    • out:輸出張量的形狀

注意:參數列表里的 * 星號,標志着位置參數的就此終結,之后的那些參數,都只能以關鍵字形式來指定

可能你到這里就信誓旦旦去調用這個函數了,但是實際結果是:

import torch
torch.normal(means=torch.arange(1,11),std=torch.arange(1,0,-0.1))
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

~\AppData\Local\Temp/ipykernel_21072/3185136372.py in <module>
      1 import torch
----> 2 torch.normal(means=torch.arange(1,11),std=torch.arange(1,0,-0.1))


TypeError: normal() received an invalid combination of arguments - got (means=Tensor, std=Tensor, ), but expected one of:
 * (Tensor mean, Tensor std, *, torch.Generator generator, Tensor out)
 * (Tensor mean, float std, *, torch.Generator generator, Tensor out)
 * (float mean, Tensor std, *, torch.Generator generator, Tensor out)
 * (float mean, float std, tuple of ints size, *, torch.Generator generator, Tensor out, torch.dtype dtype, torch.layout layout, torch.device device, bool pin_memory, bool requires_grad)

從錯誤提示可以看到,參數不應該是means,而是使用mean,所以我們把means改成mean

然而 。。。

torch.normal(mean=torch.arange(1,11),std=torch.arange(1,0,-0.1))
---------------------------------------------------------------------------

RuntimeError                              Traceback (most recent call last)

~\AppData\Local\Temp/ipykernel_21072/2194249099.py in <module>
----> 1 torch.normal(mean=torch.arange(1,11),std=torch.arange(1,0,-0.1))


RuntimeError: "normal_kernel_cpu" not implemented for 'Long'

是不是很無奈,其實這是pytorch版本的問題,我們把arrange中的數字都改成浮點數就行了

torch.normal(mean=torch.arange(1.,11.),std=torch.arange(1.,0.,-0.1))
# ([ 0.9897, // 從均值為1,標准差為1的正太分布中隨機選取的
#   2.0167,  // 從均值為2,標准差為0.9的正太分布中隨機選取的
#   3.4270,  //以此類推
#   3.9813,  
#   5.7261,  
#   6.1477,  
#   7.3065,  
#   8.3148,
#   8.6105, 
#   10.0650])
tensor([ 0.9897,  2.0167,  3.4270,  3.9813,  5.7261,  6.1477,  7.3065,  8.3148,
         8.6105, 10.0650])

2.normal(mean, std, *, out=None)

  • 參數:
    • mean(float):輸出張量中元素正態分布的均值,不過是輸出張量中的所有元素所共享的

其他部分和第一個函數一樣

torch.normal(2.,torch.arange(1.0,0,-0.1))
tensor([1.3067, 3.1319, 3.0808, 1.4510, 2.7221, 2.3876, 2.6084, 1.8700, 1.8914,
        2.0556])

3.其他兩個,大體一致

  • (Tensor mean, float std, *, torch.Generator generator, Tensor out):共享同一個標准差

  • (float mean, float std, tuple of ints size, *, torch.Generator generator, Tensor out, torch.dtype dtype, torch.layout layout, torch.device device, bool pin_memory, bool requires_grad):共享同一個均值和同一個標准差,並且需要額外指定輸出張量的形狀


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM