pytorch-个别函数用法记录

1.torch.tensor和torch.Tensor的区别

背景

torch.tensor和torch.Tensor都可以生成或将其他变量转换为tensor张量。
torch.tensor为一个函数,返回的是torch.Tensor类实例化的对象,data类型对应单双精度的torch.Tensor。
torch.Tensor为一个类,将data转换为单精度浮点型的torch.FloatTensor(torch.Tensor),类中的init函数默认转换。

torch.tensor

torch.tensor(data, *, dtype=None, device=None, requires_grad=False, pin_memory=False)
为data构建以一个tensor
data:可以是list,tuple,numpy ndarray,scaler和其他类型。
dtype:可选参数,torch.dtype,例如torch.float32,torch.float64, torch.double等
device:可选参数,将tensor放在cpu上或者gpu上,例如device=torch.device(‘cuda:0’)
requires_grad:可选参数,默认为False。当前量是否需要在计算中保留对应的梯度信息。
pin_memory:可选参数,默认为False。为True时候为锁页内存,转义到GPU上快(显卡上的内存全部为锁页内存),不与硬盘上的内存进行交换。不锁页内存:主机内存不够时候会存放到硬盘内存(虚拟内存)上。如果资源充足设为True,否则设为False。

注意的点:
torch.tensor为拷贝data,即不共用存储空间,data改变,torch.tensor(data),不改变。
如果想要避免拷贝,即引用、共用存储空间,data改变,torch.tensor(data) 也改变。则需要用:
torch.Tensor.requires_grad_() 或者 torch.Tensor.detach()
torch.Tensor.detach():共用存储空间,但是从原始的计算图中分离。比如model_A输出了一个tensor_a, tensor_a作为输入要输入到model_B中,此时想通过损失函数反向传播修改B网络的参数,但是不想修改A网络的参数就可以用detach方法,即将a从网络A中的计算图分离出来。
如果是numpy ndarray避免拷贝,则使用torch.as_tensor().

根据原始数据类型生成相应的torch.LongTensor, torch.FloatTensor,torch.DoubleTensor. torch.tensor(data),data数字后面需要加 . 才能转为torch.FloatTensor.

>>> a = torch.tensor([1, 2])
>>> a.type()
'torch.LongTensor'
>>> a = torch.tensor([1., 2.])
>>> a.type()
'torch.FloatTensor'

torch.Tensor

是一个类,init函数将data初始化为torch.FloatTensor,类中有许多对应的操作,如Tensor.max(), Tensor.new_tensor, Tensor.new_empty等。

使用

  • 创建一个已经存的数据使用torch.tensor().
  • 创建一个指定size的tensor,使用torch.*, 如torch.zeros(size=(2,3)), torch.ones(size=(2,3))
  • 创建一个和其他tensor 形状一样的tensor,使用torch.*_like, 如torch.zeros_like(size=(2,3)), torch.ones_like(size=(2,3))

2.tensor.reshape()、tensor.view()、tensor.resize_()

reshape和resize区别:

张量(tensor)是否连续: tensor中元素的地址是否连续。

导致张量不连续的操作: tensor.transpose(), tensor.permute()等操作会使得张量在内存中变得不连续。

reshapeview的相同点: 都是改变tensor的形状,且返回的张量与张量不共享内存 即更改原始张量对返回的张量无影响,更改返回的张量对原始的张量也无影响。

reshapeview的不同点:
①当张量连续时,二者基本一样。tensor.view()返回的张量与原张量共享基础数据(存储器,即基础数据都是完全一样的,只是不同形状的数据。不是共享内存地址!!),而tensor.reshape()可能返回的是原张量的copy也可能是和.view()方法返回一样类型。能返回.view()就返回,否则就是copy
②当张量不连续时,tensor.view()不能使用,需要先转换为连续tensor,即应该使用tensor.contiguous().view()。而tensor.reshape()则会先clone一个,即与原张量完全无关。

resize_

当想要resize的目标张量总元素数 > 当前张量元素时: 原张量的的数据存储器将增大,增加的新元素数值都是未初始化的。
当想要resize的目标张量总元素数 < 当前张量元素时: 原张量的的数据存储器不变,返回截取的子集。

3.torch.cat

按行或者列进行拼接。
按行拼接: z = torch.cat((x, y), 0)
按列拼接: z = torch.cat((x, y), 1)

4.torch 的广播机制

两个不同形状的张量也可以进行运算,广播机制将两个变量自动扩充为两个形状相同的张量。
广播机制是有条件的。

5.torch的内存是否重新分配(防止大的矩阵过多复制导致内存不够)

如果后面没有用到参数X,则使用X = X + Y
如果后面还可能要用到参数X和Y,则要自定义一个新的Z用0填充,即Z = torch.zero_like(X), Z = X + Y

6.torch和numpy的相互转换

numpy 转 tensor:torch.from_numpy():返回的张量与numpy共享内存,修改任意一个则另外一个都将改变。torch.as_tensor():如果原数据类型和device相同,则共享内存,修改一个则另外一个相应修改。如果不同则为拷贝。

tensor 转 numpy :tensor.numpy()

总结:
t.tensor:将数据进行拷贝,不共享内存。
t.Tensor:数据类型和device一致时,与numpy共享内存,否则会拷贝。所以t.from_numpy, t.detach(), torch.as_tensor()返回的都是Tensor,共享内存。

  • 如果对转换的numpy进行一些其他处理则要拷贝进行处理,以免影响原始张量,使用t.tensor(),速度会变慢。
  • 如果就是要修改原张量的内容,那么就使用t.Tensor()对应返回对象为Tensor类型的函数,可以节省内存和转换效率。

7.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值