张量(Tensors)
张量可以使用GPU来加快计算
构建一个未初始化的5*3的矩阵:
x = torch.Tensor(5, 3)
构建一个随机初始化的矩阵:
x = torch.rand(5, 3)
获取矩阵的大小:
x.size()
// torch.Size([5, 3])
// torch.Size 实际上是一个元组,支持元组相同的操作
张量相加:
y = torch.rand(5, 3)
torch.add(x, y)
result = torch.Tensor(5, 3)
torch.add(x, y, out=result)
// 原地操作(in-place)
// 把x加到y上
y.add_(x)
// 任何在原地(in-place)改变张量的操作都有一个'_'后缀。例如 x.copy_(y), x.t_() 操作将改变x
numpy桥
把Torch张量转换为numpy数组:
a = torch.ones(5)
b = a.numpy()
a: b:[ 1. 1. 1. 1. 1.]
1
1
1
1
1
[torch.FloatTensor of size 5]
把numpy数组转换为torch张量(自动转化):
[ 2. 2. 2. 2. 2.]
2
2
2
2
2
[torch.DoubleTensor of size 5]
CUDA张量
使用.cuda
函数可以将张量移动到GPU上
if torch.cuda.is_available():
x = x.cuda()
y = y.cuda()
x + y
Autograd: 自动求导(automatic differentiation)
PyTorch 中所有神经网络的核心是autograd
包
autograd
包为张量上的所有操作提供了自动求导.它是一个运行时定义的框架,这意味着反向传播是根据代码如何运行来定义,并且每次迭代可以不同.
变量(Variable)
autograd.Variable
是autograd
包的核心类.它包装了张量(Tensor),支持几乎所有的张量上的操作.一旦完成前向计算,可以通过.backward()
方法来自动计算所有的梯度.
可以通过.data
属性来访问变量中的原始张量,关于这个变量的梯度被计算放入.grad
属性中
对自动求导的实现还有一个非常重要的类,即函数(Function).
变量(Variable)和函数(Function)是相互联系的,并形成一个非循环图来构建一个完整的计算过程.每个变量有一个.grad_fn
属性,它指向创建该变量的一个Function
,用户自己创建的变量除外,它的grad_fn
属性为None
.
如果想计算导数,可以在一个变量上调用.backward()
.如果一个Variable是一个标量(它只有一个元素值),就不必给该方法指定任何的参数,但是该Variable有多个值,则需要指定一个和该变量相同形状的的grad_output
参数(查看API发现实际为gradients
参数).
import torch
from torch.autograd import Variable`
创建一个变量:
x = Variable(torch.ones(2, 2), requires_grad=True)
Variable containing:
1 1
1 1
[torch.FloatTensor of size 2x2]
在变量上执行操作:
y = x + 2
Variable containing:
3 3
3 3
[torch.FloatTensor of size 2x2]
// 因为y是通过一个操作创建的,所以它有grad_fn,而x是由用户创建,所以它的grad_fn为None.
print(y.grad_fn)
print(x.grad_fn)
<torch.autograd.function.AddConstantBackward object at 0x7faa6f3bdd68>
None
在y上执行操作:
z = y * y * 3
out = z.mean() // 求均值
print(z, out)
Variable containing:
27 27
27 27
[torch.FloatTensor of size 2x2]
Variable containing:
27
[torch.FloatTensor of size 1]
梯度(Gradients)
现在来执行反向传播, out.backward()
相当于执行out.backward(torch.Tensor([1.0]))
out.backward()
print(x.grad)
Variable containing:
4.5000 4.5000
4.5000 4.5000
[torch.FloatTensor of size 2x2]
神经网络
可以使用torch.nn
包来构建神经网络.
nn包依赖autograd
包来定义模型并求导.一个nn.Module
包含各个层和一个faward(input)
方法,该方法返回output
.
神经网络的典型训练过程如下:
1. 定义神经网络模型,它有一些可学习的参数(或者权重);
2. 在数据集上迭代;
3. 通过神经网络处理输入;
4. 计算损失(输出结果和正确值的差距大小)
5. 将梯度反向传播会网络的参数;
6. 更新网络的参数,主要使用如下简单的更新原则:
weight = weight - learning_rate * gradient