pytorch零散知识记录

138 阅读4分钟

本文将会记录看代码过程中的pytorch零散知识学习

1.torch的Tensor Attributes

参考博文1

pytorch从0.4开始提出了Tensor Attributes,主要包含了torch.dtype,torch.device,torch.layout。

每个torch.Tensor都有torch.dtype, torch.device,和torch.layout。

1. torch.dtype

表示torch.Tensor的数据类型的对象。PyTorch有八种不同的数据类型。

2. torch.device

代表将torch.Tensor分配到的设备的对象。

torch.device包含一个设备类型('cpu'或'cuda'设备类型)和可选的设备的序号。如果设备序号不存在,则为当前设备; 例如,torch.Tensor用设备构建'cuda'的结果等同于'cuda:X',其中X是torch.cuda.current_device()的结果。

torch.Tensor的设备可以通过Tensor.device访问属性。

构造torch.device可以通过字符串/字符串和设备编号

  • 注意 torch.device函数中的参数通常可以用一个字符串替代。这允许使用代码快速构建原型。

cuda1 = torch.device('cuda:1')

  • 注意 出于传统原因,可以通过单个设备序号构建设备,将其视为cuda设备。这匹配Tensor.get_device(),它为cuda张量返回一个序数,并且不支持cpu张量。

  • 注意 指定设备的方法可以使用(properly formatted)字符串或(legacy)整数型设备序数,即以下示例均等效:

torch.randn((2,3), device=torch.device('cuda:1'))
torch.randn((2,3), device='cuda:1')
torch.randn((2,3), device=1) 

常用:

  1. 有GPU则用GPU,否则用CPU:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
  1. 将张量复制一份到设备(CPU,GPU)
x = torch.zores(10,10)
x = x.to(device)

3. torch.layout

表示torch.Tensor内存布局的对象。

目前,支持torch.strided(dense Tensors)并为torch.sparse_coo(sparse COO Tensors)提供实验支持。

torch.strided代表密集张量,是最常用的内存布局。每个strided张量都会关联 一个torch.Storage,它保存着它的数据。这些张力提供了多维度, 存储的strided视图。Strides是一个整数型列表:k-th stride表示在张量的第k维从一个元素跳转到下一个元素所需的内存。这个概念使得可以有效地执行多张量。

2. pytorch的关系运算符

ptorch中的关系运算符lt(小于)、gt(大于)、eq(等于)、le(小于等于)、ge(大于等于)

[in]: x = torch.tensor([1,2,3,4,5])
[in]: t = x.lt(2)#小于2的值
[out]: tensor([True,False,False,False,False]) 

3. pytorch的基本运算

参考博文2

1. torch.clamp(A,X,Y)

a 为张量,x为下界线,y为上界。

当a内某个元素小于x时,取x。在[x,y]内时,取本身。大于y时,取y。

2. torch.div(X,Y)

返回x/y,如果是张量,则对应元素相除(shape要相同,除非是(2,3)与(1,2,3))

如果是x一个数,x除以y所有元素

如果是y一个数,x所有元素除以y

3. torch.mul(X,Y)

x,y都是张量,对应元素相乘。

当x,y其中一个是一个数,张量都乘以一个数。

4. torch.mm(X,Y)

求矩阵相乘,遵从矩阵相乘法则

5. torch.mv(X,Y)

x矩阵和y向量的乘法,x维度为(n,m),y的维度为m维,输出为n维向量

不支持广播

6. torch.pow(X,Y)

求幂

4. sigmoid函数

参考博文3

对于sigmoid函数来说,在pytorch中有三种,分别是:

1. torch.sigmoid(input ,out = none)

这是一个方法,包含了参数和返回值。

2. torch.nn.sigmoid

这个是一个类。在定义模型的初始化方法中使用,需要在_init__中定义,然后再使用。

3. torch.nn.functional.sigmoid(input)

这是一个方法,可以直接在正向传播中使用,而不需要初始化。在训练模型的过程中,也可以使用。

这三个sigmoid实现的功能是一样的,没有区别

5. pytorch的基本矩阵生成

1. torch.eye(n,m=None,out=None)

生成一个对角线全为1,其余全为0的矩阵。

n:行数
m:列数
out:输出类型

2. torch.repeat(*size)

参考博文4
torch.tensor.repeat()函数可以对张量进行重复扩充

当参数只有两个时:(行的重复倍数,列的重复倍数),1表示不重复。
当参数有三个时:(通道数的重复倍数,行的重复倍数,列的重复倍数),1表示不重复。

6. pytorch autograd学习

自动求导的原理介绍:07 自动求导[动手血深度学习v2]

结合pytorch官方文档讲解:10、PyTorch autograd使用教程

结合代码讲解具体函数使用:pytorch学习教程-autograd与逻辑回归

in-place操作;在原变量地址上变化的操作,即操作后地址不变;当函数的方法最后以下划线则表示in-place操作。比如c=a.mul(b)和c=a.mul_(b)不同,前者是计算a*b后产生一个新的变量地址存储值并赋给c,而后者是计算a*b后在a的原址上修改并赋给c。

7. torch.nn

1. pytorch自定义网络层

nn.Module类详解

torch.autograd.Function自定义扩展

2. nn.Sequential和nn.ModuleList

两者的区别及特点