一.认识Pytorch
1.什么是Pytorch
Pytorch是一个基于Numpy的科学计算包,向它的使用者提供了两大功能
①作为Numpy的替代者,向用户提供使用GPU强大功能的能力
②作为一款深度学习的平台,向用户提供最大的灵活性和速度
2.基本元素操作
Tensors张量:类似Numpy中的ndarray数据结构,最大的区别在于Tensor可以利用GPU的加速功能
import torch
#创建矩阵的操作
#创建一个没有初始化的矩阵
x = torch.empty(5,3)
#创建一个有初始化的矩阵
x = torch.rand(5,3)
#当声明一个未初始化的矩阵时,它本身不包含任何确切的值
#当创建一个未初始化的矩阵时,分配给矩阵的内存中有什么数值就赋值给了这个矩阵,本质是毫无意义的数据
#创建一个全零矩阵并可指定数据元素的类型为long
x = torch.zeros(5,3,dtype=torch.long)
#直接通过数据创建张量
x = torch.tensor([2.5,3.5])
#通过已有的一个张量创建相同尺寸的新张量
#利用news_methods方法得到一个张量
x = x.new_ones(5,3,dtype=torch.double)
#利用randn_like方法得到相同张量尺寸的一个新张量,并且采用随机初始化来对其赋值
y = torch.randn_like(x,dtype=torch.float)
#得到张量的尺寸
print(x.size())
#torch.size函数本质上返回的是一个tuple,因此它支持一切元组的操作
3.基本运算操作
#加法操作
x = torch.rand(5,3)
y = torch.rand(5,3)
print(x+y)
print(torch.add(x,y))
#第三种加法方式:提前设定一个空的张量,然后将空的张量作为加法的结果存储张量
result = torch.empty(5,3)
torch.add(x,y,out=result)
print(result)
#第四种加法方式:in-place(原地置换)
#所有in-place的操作函数都有一个下划线的后缀
y.add_(x)
#用类似Numpy的方式对张量进行操作
print(x[:,1])
#改变张量的形状:torch.view(),需要保证数据元素的总数量不变
x = torch.randn(4,4)
y = x.view(16)
#-1代表自动匹配个数
z = x.view(-1,8)
print(x.size(),y.size(),z.size())
#如果张量中只有一个元素,可以用.item()将值取出,作为一个python number
x = torch.randn(1)
print(x.item())
4.Torch Tensor和Numpy array之间的相互转换
#torch tensor和numpy array共享底层的内存空间,因此改变其中一个值,另一个值也会随之改变
a = torch.ones(5)
#将torch tensor转换为numpy array
b = a.numpy()
#对其中一个进行加法操作,另一个也随之被改变
a.add_(1)
#将numpy array转换为torch tensor
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a,1,out=a)
print(a)
print(b)
#注意:所有在CPU上的Tensors,除了CharTensor,都可以转换为Numpy array并可以反向转换
#关于cuda tensor:tensors可以用.to()方法来将其移动到任意设备上
#如果服务器上已经安装了GPU和CUDA
if torch.cuda.is_available():
#定义一个设备对象,这里指定成cuda,即使用GPU
device = torch.device("cuda")
#直接在GPU上创建一个Tensor
y = torch.ones_like(x,device=device)
#将在CPU上面的x张量移动到GPU上面
x = x.to(device)
#x和y都在GPU上面,才能支持加法运算
z = x + y
#此处的张量z在GPU上面
print(z)
#也可以将z转移到CPU上面,并同时指定张量元素的数据类型
print(z.to("cpu",torch.double))
二.Pytorch中的autograd
在整个Pytorch框架中,所有的神经网络本质上都是一个autograd package(自动求导工具包)
autograd package提供了一个对tensors上所有的操作进行自动微分的功能
1.torch.Tensor
torch.Tensor是整个package中的核心类,如果将属性requires_grad设置为true,它将追踪在这个类上定义的所有操作。当代码要进行反向传播的时候,直接调用.backwa