文章目录
Pytorch是神经网络届的numpy,numpy会把array放到CPU中加速计算,torch会把tensor放到GPU中加速计算。torch和numpy有很多用法是一样的,只不过numpy的方法接受的是array或者matrix,torch接受的是tensor。
按照官网安装,一般是两行命令,第一行装的是pytorch的主模块,第二行安装的torchvision,会包含一些数据库,例如图片数据库,还有一些预先训练好的模型,例如VGG,ResNet,在写神经网络模型时,可以直接照搬里面的模板。
在使用之前需要导入库,一般有
import torch
from torch import nn # 这个库用于构建神经网络的结构,neural networks的缩写
# 里面包括线性层,卷积层,循环神经网络单元等, 当然也包括很多的激活函数
from torch import optim # 优化方法,MSE,交叉熵等
from torch.utils.data import DataLoader # 用于mini-batch SGD的喂数据的类
还有一些类可以根据需要选择是否导入
from torch.autograd import Variable # 变量类,以前需要把tensor类型变成variable类型才可以反向传播
# 现在版本一般合并了tensor类型和variable类型,直接用tensor类型就可以反向传播
from collections import OrderedDict # 字典一般没有先后顺序,OrderedDict 用以生成有先后顺序的字典
from torch.utils.data.sampler import SubsetRandomSampler # 手动抽样的类,根据需要选择是否导入这个库
我们可以通过下面的方法,查看pytorch的版本,以及是否支持使用GPU加速
print(torch.__version__)
print(torch.cuda.is_available())
可以通过下面的方法查看可以使用多少GPU
print(torch.cuda.device_count())
生成tensor
使用pytorch时,要注意三种大的数据类型,一是传统python的List和numpy的nd.array,二是pytorch中的tensor,三是pytorch中的variable;早期版本,我们需要沿着这条线,从传统python数据结构转换到tensor,在从tensor转换到variable,只有variable才可以进行反向传播,但是较新的版本的pytorch合并了tensor和variable的功能(variable类仍然存在,仍可以按照老版代码写),不需要转换variable,只需要把tensor的requires_grad参数设置为True,如果requires_grad=Fasle时不需要更新梯度, 适用于冻结某些层的梯度。
# 法一:从numpy库生成模板
data = [1,2,3,4]
data = np.array(data)
tensor = torch.from_numpy(data) # 默认生成torch.int
data = [1.,2,3,4]
data = np.array(data)
tensor = torch.from_numpy(data) # 默认生成torch.float64
## 同样也可以把tensor转换成numpy形式
data2 = tensor.numpy()
# 法二:利用pytorch的一些函数,这些函数一般和numpy中的类似
tensor = torch.zeros(1, requires_grad=True) # 对应numpy中的np.zeros()
# requires_grad=True表示tensor写入计算图,进行梯度反向传播
tensor = torch.linspace(-5,5,200) # 对应numpy中的np.linspace()
tensor = torch.add(tensor,tensor) # 对应numpy中的np.add()
tensor = torch.mean(tensor) # 对应numpy中的np.mean()
# 法三:当然也可以直接转换成FloatTensor等tensor形式
tensor = torch.FloatTensor([[1,2],[3,4]]) # 直接把list转化成浮点形式的tensor
格式转换
data = [1,2,3,4]
data = np.array(data)
tensor = torch.from_numpy(data) # 默认生成torch.int
tensor = tensor.type(torch.float) # 转化为torch.float32
tensor = tensor.type(torch.float64) # 转化为torch.float64
tensor = tensor.type(torch.float16) # 转化为torch.float16
tensor = tensor.type(torch.int8) # 转化为torch.int8
设置requires_grad参数
# 生成tensor变量时就设置requires_grad
tensor = torch.zeros(1, requires_grad=True) # 生成时默认requires_grad参数是False, 除非声明requires_grad=True
# 单个tensor变量改变requires_grad
tensor = torch.FloatTensor([[1,2],[3,4]]) # 生成时默认requires_grad参数是False,torch.FloatTensor没有requires_grad参数
tensor.requires_grad = False
# 或者
tensor.requires_grad_(True)
# 整个模型改变requires_grad
for param in model.parameters():
param.requires_grad = False
注意:只有浮点类型支持backword自动求导,且求导,只能是【标量】对标量,或者【标量】对向量/矩阵求导!,一般loss函数求出来的就