torch.arange(start=0, end, step=1, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor
torch.range(start=0, end, step=1, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor
torch.linspace(start, end, steps, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor
torch.logspace(start, end, steps, base=10.0, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor
start
:创建的tensor元素的起始值(不一定一定第一个元素就是start),默认为0。end
:创建tensor中元素的末尾值(不一定最后一个值一定取到end,得看具体哪个方法和值)step
:指定从开始到结尾取数时每次增加多少,默认为1.out
:表明创建后tensor赋予哪个变量。dtype
:指定tensor中数据元素的类型,如果为None,取默认值,默认值可由torch.set_default_tensor_type()
来改变,以前讲过这个方法。layout
:返回tensor的布局,默认为torch.strided。device
:生成tensor所处的设备,可以为cpu或者cuda。requires_grad
:指定返回tensor需不需要梯度,默认为False。区别
torch.arange()
为左闭右开,即[start, end),如下所示。>>> torch.arange(5)
tensor([ 0, 1, 2, 3, 4])
>>> torch.arange(1, 4)
tensor([ 1, 2, 3])
>>> torch.arange(1, 2.5, 0.5)
tensor([ 1.0000, 1.5000, 2.0000])
注意,与end相比较时,非整数step容易受浮点舍入错误的影响,为了避免这种不一致,建议在这种情况下添加一个小的epsilon。
torch.range()
为左闭右闭,即[start, end],如下所示>>> torch.range(1, 4)
tensor([ 1., 2., 3., 4.])
>>> torch.range(1, 4, 0.5)
tensor([ 1.0000, 1.5000, 2.0000, 2.5000, 3.0000, 3.5000, 4.0000])
注意,由于这个方法是左右都闭合,与python中自带的range(左闭右开)不同,所以此方法已经过时了,并且会在以后的版本删除,以后请使用torch.arange()
与range()
一样为左闭右开。
torch.linspace()
,这个方法也是左闭右闭的,但是这个方法和前面的不太一样,它这里的步长其实和前面的不是一个意思,它的计算步骤如下根据公式可能有些看不懂,其实它的意思是,linspace中的steps与咱们上面两个理解的step不同,因为这方法需要左闭右闭,并且中间必须等间隔,而如果我们提供向上面一样的step是可能不会右闭的,例如:
(start=1, end=5, step)
这样得取值永远不会得到end,为了避免这种情况,linspace中使用 e n d − s t a r t s t e p s \frac{end-start}{steps} stepsend−start来作为上面理解的step,这样以后就和上面一样了,而且一定可以取到end,所以这里的它用steps来区别,而不是step。但是感觉这里有问题,因为按照官网给的这个公式,他的很多东西是不对的,实际输出与这样算出来的不一样,例如:
按照,官网的公式,输出应该为([0, 5, 10])才对,但是结果确不是这样的,不过看了很多式子后总结了一个规律是steps就是将(start, end)分成包含start和end的多少个数,steps是多少,返回的tensor中就有多少个元素,实际操作也确实这样得,实际使用如下:
>>> torch.linspace(3, 10, steps=5)
tensor([ 3.0000, 4.7500, 6.5000, 8.2500, 10.0000])
>>> torch.linspace(-10, 10, steps=5)
tensor([-10., -5., 0., 5., 10.])
>>> torch.linspace(start=-10, end=10, steps=5)
tensor([-10., -5., 0., 5., 10.])
>>> torch.linspace(start=-10, end=10, steps=1)
tensor([-10.])
注意:虽然,linspace可以不提供steps(此时会返回100个数),如下所示,但是此行为未反映在已记录的功能签名中,在未来的pytorc版本中,如果无法提供步骤值,则会引发runtime error,所以大家加上steps为好。
torch.logspace()
:此方法创造出来的数和前面不太一样,如下所示:此方法也可以不提供过steps,同样返回100个数,但是在以后的版本中不提供steps将返回一个runtime error,也是加上为好。