Deep Learning with Pytorch: A 60 Minute Blitz
Blitz :以闪电战空袭
这篇文档的目标
- 在一个较高的水平理解 Pytorch 的 Tensor 库和神经网络
- 训练一个分类图像的小规模神经网络分类图像
这篇文章假设你基本熟悉 numpy
什么是Pytorch
Pytorch是基于科学计算包的Python,目标两类人群
1. 为利用 GPU 的能力取代 NumPy
2. 提供最大灵活性和速度的深度学习研究平台
开始
Tensors
Tensors类似于Numpy的narrays,只是Tensors可以使用GPU加速计算
from __future__ import print_function
import torch
构建一个 5*3 的未初始化矩阵
x = torch.Tensor(5, 3)
构建一个随机初始化的矩阵
x = torch.rand(5, 3)
获得矩阵的尺寸
print(x.size())
Out: torch.Size([5, 3]) ; 输出的结果
操作
Pytorch对操作有很多句法。在下面的例子我们会看到加法的操作
y = torch.rand(5, 3)
print(x + y)
或者, 加法语法②
torch.add(x, y)
加法: 提供一个输出tensor作为参数
result = torch.Tensor(5, 3)
torch.add(x, y, out=result)
print(result)
就地 ( in-place )加法
y.add_(x)
Note : 任何使一个Tensor就地发生变化的操作都要在后面加上一个’_’
同样可以使用像 NumPy 一样的索引表示
print(x[:, 1])
修改大小 :如果你要resize或者reshape tensor,可以使用torch.view
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8); -1的值会从另一维度推出
print(x.size(), y.size(), z.size())
Out: torch.Size([4, 4]), torch.Size([16]), torch.Size([2, 8])
还有 100+ 中操作, 看这里
Numpy Bridge
将一个 Torch Tensor 转换成 NumPy array 或者反过来是一件很轻松的事情
Torch Tensor 和 NumPy array 会共享隐藏的内存地址,因此改变一个两者都将改变
将一个 Torch Tensor 转换成 NumPy array
a = torch.ones(5);
b = a.numpy()
看一下 NumPy array 是怎么样改变数值的
a.add_(1)
将一个 NumPy array 转换成 Torch Tensor
看一下怎样自动将 NumPy array 转换成 Torch Tensor
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
CUDA Tensors
Tensors 可以使用.cuda方法转移至GPU运算
附录: 还有那100+中操作呢….
Tensors
torch.is_tensor(obj)
返回 True 如果 obj 是一个 Pytorch tensor
torch.is_storage(obj)
返回 True 如果 obj 是 pytorch 存储对象
torch.set_default_tensor_type()
torch.numel(input)
返回输入Tensor中元素总数
torch.set_printoptions(precesion=None, threshold=None, edgeitems=None, linewidth=None, profile=None)
Creation Ops
torch.eye(n, m=None, out=None)
返回2-D除对角线为1其他全为0的矩阵
torch.from_numpy(ndarray)
从numpy.ndarray创造一个Tensor
torch.linspace(start, end, steps=100, out=None)
返回一维Tensor,steps均分从start到end
torch.logspace(start, end, steps=100, out=None)
返回一维tensor,steps均分从10^start到10^end
torch.ones(*size,out=None)
返回所有元素都是标量1的tensor, 由size决定shape
torch.ones_like(input, out=None)
返回和input的size一样的所有元素都是1的tensor
torch.arange(start=0, end, step=1, out=None)
返回一维tensor,尺寸为(end-start)/step, [start, end), 每两个相邻元素之间差step
torch.range(start, end, step=1, out=None)
就是比arange多了一个end元素
Warning : 该函数由于arange已被弃用
torch.zeros(*size, out=None)
返回所有元素都是0的Tensor,由size决定shape
torch.zeros_like(input, out=None)
参照上面 ones_like
索引, 切片, 联合, 旋转操作
torch.cat(seq, dim=0, out=None)
cat for concatenate (成串)连结
将给定的Tensor序列在给定的维度上连结, 除了在cat维, 所有Tensor必须size相同
x = torch.randn(2, 3)
y = torch.Tensoe(2, 3)
torch.cat((x, y), dim=1)
torch.chunk(tensor, chunks, dim=0)
将一个Tensor分解成给定数目的块
To be continued…
torch.gather(input, dim, index, out=None)