本文将会记录看代码过程中的pytorch零散知识学习
1.torch的Tensor Attributes
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)
常用:
- 有GPU则用GPU,否则用CPU:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
- 将张量复制一份到设备(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的基本运算
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函数
对于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。