pytorch学习笔记1

pytorch学习笔记1
开始学习Pytorch了,参考了网上大神的博客以及《深度学习之Pytorch实战计算机视觉》记录学习过程,欢迎各位交流。

pytorch基础学习与环境搭建

PyTorch是美国互联网巨头FaceBook在深度学习框架Torch基础上用python重写的一个全新深度学习框架,功能与Numpy类似,但在继承Numpy多种优点之上,也支持GPU运算,可进行深度学习模型的训练等。此外Pytorch还提供了很多丰富的API,可快速搭建深度学习网络和模型。相比于TensorFlow,Pytorch更易上手,对深度学习初学者更友好,在研究届应用十分广泛。

1 PyTorch与深度学习中常见概念解释

Tensor是PyTorch中负责存储基本数据的单位,PyTorch针对Tensor提供丰富的函数与方法,Tensor在一定程度上与Numpy中的数组类似。但Tensor是一种更高层次的架构,且PyTorch中定义的Tensor数据类型只需对变量进行简单类型转换就可在GPUs上进行运算。注意在深度学习中,Rank更像是维度,而不是线性代数中的矩阵的秩。eg:Rank=0是标量,Rank=1是向量,Rank=2就是矩阵。

1.1 Tensor数据类型

使用Tensor时,首先了解如何使用Tensor来定义不同数据类型的变量。类似于Numpy,PyTorch中的Tensor也有自己的数据类型定义方式。具体如下所示:

1.1.1 torch.FloatTensor

import torch //导入头文件,然后即可使用
a = torch.FloatTensor(2,3)    //即可得到一个2x3的tensor,为浮点型
print(a)   

 //按给定的列表生成的一个4x1的tnsor,2345各占一行
b = torch.FloatTensor([2,3,4,5])  
print(b)

类似的还可定义int类型的,将FloatTensor改成IntTensor即可,记住import torch。

1.1.2 torch.rand

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)

1.1.3 torch.range

torch.range用于生成浮点型且可自定义数据起始和结束范围的Tensor,传递给torch.range的参数有三个,分别为范围的起始值,结束值及步长,步长是指从起始值到结束值每步的数据间隔。

import torch
a = torch.range(1,10,2)
//则输出就分别为13579

1.1.4 torch.zeros

用于生成Tensor中元素值全为0.的指定维度的浮点型数据

import torch
a = torch.zeros(2,3)    //2x3的tensor,全为0.

1.2 Tensor的运算

在了解了Tensor的数据类型后,下面来了解一些常用的Tensor运算。类似于数的四则运算,但也有不同。

1.2.1 torch.abs

torch.abs将传入参数转化为绝对值输出,输入输出参数均为Tensor数据类型的变量。

import torch
a = torch.randn(2,3)

b = torch.abs(a)

1.2.2 torch.add

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)

1.2.3 torch.clamp

对输入参数按照自定义范围进行剪裁,然后将剪裁结果作为输出。共三个输入参数,分别为需剪裁的Tensor数据类型,剪裁的上边界和剪裁的下边界。将变量中的每个值与剪裁上下边界比较,小于下边界的,该元素被重写为下边界,大于上边界的,该元素被重写为上边界,位于上下边界之间的不变。

import torch
a = torch.randn(2,3)
b = torch.clamp(a,-0.1,0.1)    
//则a中所有元素的范围会变为-0.10.1之间

1.2.4 torch.mul与torch.mm

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运用的是矩阵之间的乘法规则进行运算,被传入参数会被当做矩阵进行处理,参数的维度也需满足矩阵乘法的前提条件。

1.2.5 torch.pow

将参数传递到torch.pow后返回输入参数的求幂结果输出,参与运算的参数可均为tensor数据类型,也可是tensor数据类型和标量的组合

import torch
a = torch.randn(2,3)
b= torch.pow(a,2)

1.3 more details

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()          //输出一个数值

1.3 torch与numpy的区别与联系

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间的互相转换

1.3 CUDA Tensors

如果有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)

你可能感兴趣的:(AI,cv,pytorch,学习笔记)