一、Tensor入门
inplace method:
y.add_ (x) equals y = y.add(x)
tensor和numpy类型可以快速转换,是共享内存,几乎不消耗时间。但应注意值改变问题。
使用GPU加速
Tensor的.cuda方法可以将其转化为GPU
的Tensor
可以发现GPU比CPU快了将近十倍
二、Autograd:自动微分
autograd.Variable
是Autograd的核心类,它封装了Tensor,其主要包含三个属性:data
、grad
和grad_fn
.
(在新版本上,感觉Variable和Tensor差别不大,Tensor加上requires_grad参数也可以反向传播求导)
data: Tensor;
grad:data的梯度;
grad_fn:指向一个用来反向传播计算输入梯度的函数对象.
定义Variable时,一定要为requires_grad
参数赋True
,否则不能反向传播求梯度。
grad在反向传播的过程中是累加的,所以每次反向传播之前应该把梯度清零:x.grad.zero_()
三、神经网络
torch.nn是专门为神经网络设计的模块接口。nn构建于Autograd之上,可以用来定义和运行神经网络。nn.Module是nn中最重要的类,可以把它看作一个网络的封装。
以LeNet为例:
定义网络:
from torch import nn
from torch.nn import functional as F
class Net(nn.Module):
def __init__(self):
super(Net,self).__init__()
self.conv1 = nn.Conv2d(1, 6, 5)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16*5*5,120)
self.fc2 = nn.Linear(120,84)
self.fc3 = nn.Linear(84,10)
def forward(self, x):
x = F.max_pool2d(F.relu(self.conv1(x)),(2,2))
x = F.max_pool2d(F.relu(self.conv2(x)),2)
x = x.view(x.size()[0],-1)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net()
只要在nn.Module的子类中定义了forward,backward函数就会自动被实现。
损失函数
out = net(input)
target = t.Tensor(1,10)
target[0] = t.arange(0,10).float()
target = Variable(target)
criterion = nn.MSELoss()
loss = criterion(out,target)
loss.backward()
调用loss.backward()
函数时,该图会动态生成并自动微分,也会自动计算图中参数的导数。
优化器
在反向传播计算完所有参数的梯度后,还需要用优化器更新网络的权重和参数。torch.optim
中实现了深度学习中绝大多数的优化方法。
optimizer = optim.SGD(net.parameters(),lr = 0.01)
optimizer.zero_grad()
loss.backward()
optimizer.step() # 更新参数
数据加载和预处理
在深度学习中数据加载及预处理是非常复杂的,但PyTorch提供了一些可极大简化和加快数据处理流程的工具。同时,对于常用数据集,PyTorch也提供了封装好的接口,这些数据集主要保存在torchvision中。