pytorch基础理论
1 基本操作对象:Tensor
常用的不同种的数据类型:
32位浮点型torch.FloatTensor
64位浮点型torch.DoubleTensor
16位整型 torch.ShortTensor
32位整型 torch.IntTensor
64位整型 torch.LongTensor
torch.Tensor 为默认数据类型:torch.FloatTensor
Tensor 可以 numpt.ndarray之间相互转换,转换演示代码如下
https://www.cnblogs.com/quietwalk/p/8003862.html(介绍ndarray)
import torch
import numpy as np
b = torch.Tensor([[2,3],[4,5]])
numpy_b = b.numpy() #将tensor b转换成numpy类型
print('numpy_b is \n {}'.format(numpy_b))
e = np.array([[2,3],[3,4]])
torch_e = torch.from_numpy(e) #将numpy转化成 tensor
print("form numpy to torch,torch_e is \n {}".format(torch_e))
float_torch_e = torch_e.float() #将int 型 torch_e 转成 float
print("changing the int to float is {}".format(float_torch_e))
结果显示
2 Variable
Variable 会在torch .autograd.Variable中
将tensor a 变成variable,仅需要Variable(a)即可
Varable属性图
import torch
from torch.autograd import Variable
x = torch.randn(3)
print(x)
x = Variable(x,requires_grad=True)
#requires_grad 参数,表示是否对x对梯度
y = x * 2
print(y)
y.backward(torch.FloatTensor([1,1,1]))
#由于y为向量,因此不能直接写y.backward(),需要传入参数,得到的是每个分量的梯度
#torch.FloatTensor([1,0.1,0.01]) 为原梯度乘以1,0.1,0.01
print(x.grad)
结果显示:
3 Dataset
torch.utils.data.Dataset 表示这一数据抽象类
通过torch.utils.data.DatasetLoader 定义迭代器
dataiter = DataLoader(myDataset,batch_size=32,shuffle =True,collate_fn = default_collate)
batch 批处理 ;batch_size:每批数据量的大小;Shuffle,打乱输入数据的顺序,不让输入数据的顺序对模型产生影响。
collate_fn 表示如何取样本,可自行定义
torchvision 在计算机视觉中有关于数据读取的类:IamgeFolder,其功能主要是处理图片,要求图片格式为 .png
4 torch.optim
torch.optim是一个实现了多种优化算法的包,大多数通用的方法都已支持,提供了丰富的接口调用,未来更多精炼的优化算法也将整合进来。
https://blog.csdn.net/kgzhang/article/details/77479737
6 nn.Moduld(定义自已的网络)
原文来自:https://blog.csdn.net/u012609509/article/details/81203436
需要继承nn.Module类,并实现forward方法。
一般把网络中具有可学习参数的层放在构造函数__init__()中,
不具有可学习参数的层(如ReLU)可放在构造函数中,也可不放在构造函数中(而在forward中使用nn.functional来代替)
只要在nn.Module的子类中定义了forward函数,backward函数就会被自动实现(利用Autograd)。
在forward函数中可以使用任何Variable支持的函数,毕竟在整个pytorch构建的图中,是Variable在流动。还可以使用if,for,print,log等python语法.
注:Pytorch基于nn.Module构建的模型中,只支持mini-batch的Variable输入方式,
比如,只有一张输入图片,也需要变成 N x C x H x W 的形式:
input_image = torch.FloatTensor(1, 28, 28)
input_image = Variable(input_image)
input_image = input_image.unsqueeze(0) # 1 x 1 x 28 x 28