前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pytorch的python API略读--tensor(二)

pytorch的python API略读--tensor(二)

作者头像
用户9875047
发布2022-07-04 13:58:40
2090
发布2022-07-04 13:58:40
举报
文章被收录于专栏:机器视觉全栈er

2.1.1 创建

在编写程序的时候,我们往往需要一些数据,这些数据常有两种来源:手动输入的一些数据,或者从外部接收后转换得到的数据。手动输入的数据设计如下函数:tensor, zeros, zeros_like, ones, ones_like,arange,range,linspace,logspace,eye,empty,empty_like,empty_strided,full,full_like。

tensor:这是最基本的构建一个tensor的方法,用法如下:

代码语言:javascript
复制
torch.tensor(data, *, dtype=None, device=None, requires_grad=False,
 pin_memory=False)

data表示要构建的tensor,dtype指的是data type,device可以是CPU,也可以是GPU,requires_grad的默认值是False,设置为True的话,可以对在当前tensor计算中保留对应梯度信息。假如现在需要设置一个tensor,类型为torch.float64,使用GPU,跟踪梯度信息,创建方法如下:

代码语言:javascript
复制
>>> import torch
>>> torch.tensor([[1., 2., 3.]], dtype=torch.float64, 
device=torch.device('cuda:0'), requires_grad=True)

zeros, zeros_like, ones, ones_like:这四个函数是快速的创建tensor,zeros和ones分别创建为0或者为1的tensor,zeros_like和ones_like也是创建为0或者为1的tensor,不同的是zeros_like和ones_like需要tensor作为输入,like的意思是类似,类似输入tensor的shape,这样就无须预先知道某个tensor的shape即可创建出和该tensor同样shape的tensor(有点绕口),用法如下:

代码语言:javascript
复制
torch.zeros(*size, *, out=None, dtype=None, layout=torch.strided, 
device=None, requires_grad=False)
代码语言:javascript
复制
torch.zeros_like(input, *, dtype=None, layout=None, device=None, 
requires_grad=False, memory_format=torch.preserve_format)
代码语言:javascript
复制
torch.ones(*size, *, out=None, dtype=None, layout=torch.strided, 
device=None, requires_grad=False)
代码语言:javascript
复制
torch.ones_like(input, *, dtype=None, layout=None, device=None, 
requires_grad=False, memory_format=torch.preserve_format)

上面的用法是详细的接口,一般来说,只会使用最基本的,例如:

代码语言:javascript
复制
>>> import torch
>>> torch.ones(3, 4)
tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]])
>>> cvtutorials = torch.ones(4, 4)
>>> torch.ones_like(cvtutorials)
tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]])

torch.full和torch.full_like可以看作是torch.ones和torch.ones_like衍生出来的函数。

arange, range, linspace, logspace:arange、range和linspace用来构造公差数列。logspace用来构造指数的幂为等差数列的数组,他们的用法如下:

代码语言:javascript
复制
torch.arange(start=0, end, step=1, *, out=None, dtype=None, 
layout=torch.strided, device=None, requires_grad=False)
代码语言:javascript
复制
torch.range(start=0, end, step=1, *, out=None, dtype=None, 
layout=torch.strided, device=None, requires_grad=False)
代码语言:javascript
复制
torch.linspace(start, end, steps, *, out=None, dtype=None,
layout=torch.strided, device=None, requires_grad=False)
代码语言:javascript
复制
torch.logspace(start, end, steps, base=10.0, *, out=None, dtype=None, 
layout=torch.strided, device=None, requires_grad=False)

我们先来看看torch.arange()的实际用例:

代码语言:javascript
复制
>>> import torch
>>> torch.range(1, 5, 0.5)
__main__:1: UserWarning: torch.range is deprecated and will be removed in a future release because its behavior is inconsistent with Python's range builtin. Instead, use torch.arange, which produces values in [start, end).
tensor([1.0000, 1.5000, 2.0000, 2.5000, 3.0000, 3.5000, 4.0000, 4.5000, 5.0000])

我这里是1.7版本的torch,提示torch.range()这种用法已被废弃,他和python内置的range函数用法不兼容,所以官方建议使用torch.arange()函数,使用torch.arange()函数,结果如下:

代码语言:javascript
复制
>>> import torch
>>> torch.arange(1, 5, 0.5)
tensor([1.0000, 1.5000, 2.0000, 2.5000, 3.0000, 3.5000, 4.0000, 4.5000])

至于linspace,这个函数在matlab、numpy中都可以看到,实际用例如下:

代码语言:javascript
复制
>>> import torch
>>> torch.linspace(1.0, 5.0, 5)
tensor([1., 2., 3., 4., 5.])

注意:linspace函数参数中的steps只能是int类型,它指的是生成数组的大小,和torch.arange中的step要注意区分。

logspace和linspace用法类似,只不过start和end指的是幂指数,用例如下:

代码语言:javascript
复制
>>> import torch
>>> torch.logspace(start=1.0, end=5.0, steps=5)
tensor([1.0000e+01, 1.0000e+02, 1.0000e+03, 1.0000e+04, 1.0000e+05])

从外部接收后转换得到的数据涉及如下函数:as_tensor,from_numpy。

as_tensor:将数据转换成torch.Tensor,用法如下:

代码语言:javascript
复制
torch.as_tensor(data, dtype=None, device=None)

如果待转换的data在cpu上,而且转换后的形状和数据类型不变,那么返回的tensor是data的引用,对返回的tensor进行操作,原来的data也会发生变化,示例如下:

代码语言:javascript
复制
>>> import torch
>>> import numpy
>>> cvtutorials = numpy.array([1.0, 2.0, 3.0])
>>> temp_tensor = torch.as_tensor(cvtutorials)
>>> temp_tensor[2] = -3.0
>>> temp_tensor
tensor([ 1.,  2., -3.], dtype=torch.float64)
>>> cvtutorials
array([ 1.,  2., -3.])

如果将data放到GPU上,那么就会对data进行复制,分配到新的变量上,示例如下:

代码语言:javascript
复制
>>> import torch
>>> import numpy
>>> cvtutorials = numpy.array([1.0, 2.0, 3.0])
>>> temp_tensor = torch.as_tensor(cvtutorials, device=torch.device('cuda'))
>>> temp_tensor[2] = -3.0
>>> temp_tensor
tensor([ 1.,  2., -3.], device='cuda:0', dtype=torch.float64)
>>> cvtutorials
array([ 1.,  2., 3.])
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器视觉全栈er 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.1.1 创建
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档