原文:DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ
作者:Soumith Chintala
本文的目标:
在高水平之上理解PyTorch的Tensor库和神经网络
训练一个小型的神经网络用于图像分类
本文假设读者基本熟悉numpy库,并确保已经安装了torch和torchvision包
WHAT IS PYTORCH?
这是一个基于Python的科学计算包,面向两类读者:
替代NumPy,使用GPU的算力
最大灵活性和速度的深度学习研究平台
入门
Tensors
Tensors类似于NumPy的ndarrays,另外Tensors还可以用于GPU以加速计算。
1 | import torch |
构造5x3矩阵,未初始化:
1 | x = torch.empty(5, 3) |
输出:
1 | tensor([[0.0000e+00, 2.5244e-29, 1.6466e-32], |
构造一个随机初始化的矩阵:
1 | x = torch.rand(5, 3) |
输出:
1 | tensor([[0.5012, 0.3640, 0.4218], |
构造一个元素都为零的矩阵,并且dtype为torch.long:
1 | x = torch.zeros(5, 3, dtype=torch.long) |
输出:
1 | tensor([[0, 0, 0], |
直接从数据中构造一个Tensor:
1 | x = torch.tensor([5.5, 3]) |
输出:
1 | tensor([5.5000, 3.0000]) |
或者基于现有的Tensor创建一个Tensor(若不重新指定,属性将被重用):
1 | x = x.new_ones(5, 3, dtype=torch.double) # new_* methods take in sizes |
输出:
1 | tensor([[1., 1., 1.], |
得到Tensor的大小:
1 | print(x.size()) |
输出:
1 | torch.Size([5, 3]) |
torch.Size()事实上是一个元祖,支持元祖的所有操作
运算
运算有多种语法,在下面的例子中,我们将看一下加法运算:
加法:语法1
1 | y = torch.rand(5, 3) |
输出:
1 | tensor([[ 1.6621, 1.0583, -0.5897], |
加法:语法2
1 | print(torch.add(x, y)) |
输出:
1 | tensor([[ 1.6621, 1.0583, -0.5897], |
加法:提供一个输出Tensor作为参数
1 | result = torch.empty(5, 3) |
输出:
1 | tensor([[ 1.6621, 1.0583, -0.5897], |
加法:就地
1 | # adds x to y |
输出:
1 | tensor([[ 1.6621, 1.0583, -0.5897], |
也可以利用类似NumPy的索引方法获得Tensor中的元素
1 | print(x[:, 1]) |
输出:
1 | tensor([ 0.7962, 1.3713, -1.9346, -0.1919, -1.2615]) |
调整大小:如果要调整Tensor的大小/形状,可以使用torch.view:
1 | x = torch.randn(4, 4) |
输出:
1 | torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8]) |
只有一个元素的Tensor,可以用.item()的方法获得该数值
1 | x = torch.randn(1) |
输出:
1 | tensor([-0.1790]) |
更多的Tensor运算,请参考官方文档
NumPy的桥梁作用
Torch Tensor与NumPy array的相互转化
Torch Tensor和NumPy array将共享它们的底层内存位置(如果Torch Tensor在CPU上),更改其中一个将更改另一个。
将Torch Tensor转换为NumPy Array
1 | a = torch.ones(5) |
输出
1 | tensor([1., 1., 1., 1., 1.]) |
1 | b = a.numpy() |
输出:
1 | [1. 1. 1. 1. 1.] |
看numpy array的值是如何变化的
1 | a.add_(1) |
输出:
1 | tensor([2., 2., 2., 2., 2.]) |
将NumPy Array转换为Torch Tensor
看如何更改NumPy array,使得Torch Tensor自动更改
1 | import numpy as np |
输出:
1 | [2. 2. 2. 2. 2.] |
除了CharTensor之外,所有的CPU上的Tensors都可以与NumPy相互转化
CUDA Tensors
Tensor可以使用.to方法移动到任何设备上。
1 | # let us run this cell only if CUDA is available |
输出:
1 | tensor([0.6613], device='cuda:0') |
AUTOGRAD: AUTOMATIC DIFFERENTIATION(自动微分)
翻译到这里发现翻译的毫无意义,算了还是看原文吧^_^