pytorch每日一学20(torch.arange()、torch.range()、torch.linespace()、torch.logspace())根据步长创造一维tensor

第20学

  • 此次学习所有的根据步长创建一维tensor的几个方法,因为基本相似,所以把他们都放在一起,并进行比较。
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
  • 今天就讲解以上4个方法,基本上这几个方法的参数也很相似,就是给定了开始和结束以及步长,从开始数开始一直到结尾数每次加一个步长,取到的值作为tensor中的元素。r这里就统一介绍以下几个参数的意思
  • 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} stepsendstart来作为上面理解的step,这样以后就和上面一样了,而且一定可以取到end,所以这里的它用steps来区别,而不是step。但是感觉这里有问题,因为按照官网给的这个公式,他的很多东西是不对的,实际输出与这样算出来的不一样,例如:
pytorch每日一学20(torch.arange()、torch.range()、torch.linespace()、torch.logspace())根据步长创造一维tensor_第1张图片
按照,官网的公式,输出应该为([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为好。
pytorch每日一学20(torch.arange()、torch.range()、torch.linespace()、torch.logspace())根据步长创造一维tensor_第2张图片

  • torch.logspace():此方法创造出来的数和前面不太一样,如下所示:
    在这里插入图片描述
    可以看到base就是底数,默认为10.0,而后面就是和上面的linspace是一样的,它的steps也不是step,而是进行了和上面一样的处理,使用 e n d − s t a r t s t e p s \frac{end-start}{steps} stepsendstart才是上面理解的step,当然这里和linspace一样也有些问题。实际结果是steps是指tensor中的数的个数。
    在logsapce,其实是将这些参数进行上面的linspce步骤后,再把这些数放在base的指数上组成一组数形成tensor。与linspace一样,steps是多少,返回的tensor中就有多少个数。

此方法也可以不提供过steps,同样返回100个数,但是在以后的版本中不提供steps将返回一个runtime error,也是加上为好。

你可能感兴趣的:(pytorch每日一学,python,pytorch,机器学习,神经网络,深度学习)