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/ in <module>
1 import torch
----> 2 (means=(1,11),std=(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, *, generator, Tensor out)
* (Tensor mean, float std, *, generator, Tensor out)
* (float mean, Tensor std, *, generator, Tensor out)
* (float mean, float std, tuple of ints size, *, generator, Tensor out, dtype, layout, 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/ in <module>
----> 1 (mean=(1,11),std=(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])
(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, *, generator, Tensor out):共享同一个标准差
-
(float mean, float std, tuple of ints size, *, generator, Tensor out, dtype, layout, device, bool pin_memory, bool requires_grad):共享同一个均值和同一个标准差,并且需要额外指定输出张量的形状