pytorch学习笔记1
开始学习Pytorch了,参考了网上大神的博客以及《深度学习之Pytorch实战计算机视觉》记录学习过程,欢迎各位交流。
PyTorch是美国互联网巨头FaceBook在深度学习框架Torch基础上用python重写的一个全新深度学习框架,功能与Numpy类似,但在继承Numpy多种优点之上,也支持GPU运算,可进行深度学习模型的训练等。此外Pytorch还提供了很多丰富的API,可快速搭建深度学习网络和模型。相比于TensorFlow,Pytorch更易上手,对深度学习初学者更友好,在研究届应用十分广泛。
Tensor是PyTorch中负责存储基本数据的单位,PyTorch针对Tensor提供丰富的函数与方法,Tensor在一定程度上与Numpy中的数组类似。但Tensor是一种更高层次的架构,且PyTorch中定义的Tensor数据类型只需对变量进行简单类型转换就可在GPUs上进行运算。注意在深度学习中,Rank更像是维度,而不是线性代数中的矩阵的秩。eg:Rank=0是标量,Rank=1是向量,Rank=2就是矩阵。
使用Tensor时,首先了解如何使用Tensor来定义不同数据类型的变量。类似于Numpy,PyTorch中的Tensor也有自己的数据类型定义方式。具体如下所示:
import torch //导入头文件,然后即可使用
a = torch.FloatTensor(2,3) //即可得到一个2x3的tensor,为浮点型
print(a)
//按给定的列表生成的一个4x1的tnsor,2,3,4,5各占一行
b = torch.FloatTensor([2,3,4,5])
print(b)
类似的还可定义int类型的,将FloatTensor改成IntTensor即可,记住import torch。
torch.rand用于生成数据类型为浮点型且维度随机指定的Tensor,类似Numpy中的numpy.rand生成随机数的方法。
import torch
//生成2x3的tensor,随机生成的浮点数据类型在0-1间均匀分布
a = torch.rand(2,3)
//生成2x3的tensor,随机生成的浮点数据满足均值为0,方差为1的正态分布
b = torch.randn(2,3)
torch.range用于生成浮点型且可自定义数据起始和结束范围的Tensor,传递给torch.range的参数有三个,分别为范围的起始值,结束值及步长,步长是指从起始值到结束值每步的数据间隔。
import torch
a = torch.range(1,10,2)
//则输出就分别为1,3,5,7,9
用于生成Tensor中元素值全为0.的指定维度的浮点型数据
import torch
a = torch.zeros(2,3) //2x3的tensor,全为0.
在了解了Tensor的数据类型后,下面来了解一些常用的Tensor运算。类似于数的四则运算,但也有不同。
torch.abs将传入参数转化为绝对值输出,输入输出参数均为Tensor数据类型的变量。
import torch
a = torch.randn(2,3)
b = torch.abs(a)
torch.add将传入的参数求和作为结果输出,torch.div为相除类似
输入即可全部为Tensor数据类型,也可一个是Tensor数据类型,一个是标量。
import torch
a = torch.randn(2,3)
b = torch.rand(2,3)
c = torch.add(a,b)
d = torch.add(c,1)
对输入参数按照自定义范围进行剪裁,然后将剪裁结果作为输出。共三个输入参数,分别为需剪裁的Tensor数据类型,剪裁的上边界和剪裁的下边界。将变量中的每个值与剪裁上下边界比较,小于下边界的,该元素被重写为下边界,大于上边界的,该元素被重写为上边界,位于上下边界之间的不变。
import torch
a = torch.randn(2,3)
b = torch.clamp(a,-0.1,0.1)
//则a中所有元素的范围会变为-0.1到0.1之间
torch.mul将输入参数进行求积后的结果输出,参数可以都是Tensor数据类型的,也可仅一个是,另一个是标量
import torch
a = torch.randn(2,3)
b = torch.randn(2,3)
c = torch.mul(a,b)
d = torch.mul(c,2)
e = torch.randn(2,3)
f = torch.randn(3,2)
h = torch.mm(e,f) //输出为2x2的tensor
torch.mm运用的是矩阵之间的乘法规则进行运算,被传入参数会被当做矩阵进行处理,参数的维度也需满足矩阵乘法的前提条件。
将参数传递到torch.pow后返回输入参数的求幂结果输出,参与运算的参数可均为tensor数据类型,也可是tensor数据类型和标量的组合
import torch
a = torch.randn(2,3)
b= torch.pow(a,2)
import torch
#构造一个未初始化的矩阵
x = torch.empty(5,3)
y = torch.zeros(5,3,dtype = torch.long)
#得到tensor的形状
x.size()
x.shape()
#in_place加法
y.add_(x) # 在pytorch中。加下划线的操作,则新的结果会被保存在y中
x.copy_()
x.t_() #均会改变x,将新结果保存到了x中
#pytorch中想resize/reshape一个tensor,可使用torch.view:
x = torch.randn(4,4)
y = x.view(16)
z = x.view(2,-1) #自动计算-1的位置为8
#只有一个元素的tensor时,可使用.item()方法,把其中value变成Python数值
x = torch.randn(1)
x.item() //输出一个数值
torch tensor和numpy array间的相互转化很容易
且Torch Tensor和Numpy array会共享内存,改变其中一项,另一项也会改变
a = torch.ones(5)
转成numpy array
b = a.numpy()
b[1] = 2 #则,a与b中的值均改变,因为共享内存
所有CPU上Tensor都支持与Numpy间的互相转换
如果有GPU时,就可以转换成CUDA tensors,加速运算过程
一般使用.to方法,可将Tensor移动到别的device上
if torch.cuda.is_available(): #设备上有GPU时,会返回True,否则False
device = torch.device("cuda")
x = x.to(device) #将Tensor搬到GPU上去,运算过程加快
#也可在用.to方法搬回CPU
x.to("cpu",torch.double)