PyTorch教程:什么是PyTorch

目录

本文翻译自Pytorch官方文档《DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ

Pytorch 是基于 Python 的科学计算包,面向两类用户:

  • 替代 NumPy 以使用 GPUs 的功能
  • 提供最大灵活性和速度的深度学习研究平台

开始

Tensors

Tensors 与 NumPy 的 ndarray 相似,此外,Tensor 也可以在 GPU 上使用以加速计算。

import torch

声明了一个未初始化的矩阵,但在使用前不包含确定的已知值。 创建未初始化的矩阵时,当时分配的内存中的任何值都将显示为初始值。

构造一个未初始化的5x3矩阵:

x = torch.empty(5, 3)
x
tensor([[6.0426e-15, 7.4969e-43, 6.0426e-15],
        [7.4969e-43, 6.0414e-15, 7.4969e-43],
        [6.0414e-15, 7.4969e-43, 6.0437e-15],
        [7.4969e-43, 6.0437e-15, 7.4969e-43],
        [6.0423e-15, 7.4969e-43, 6.0423e-15]])

构造一个随机初始化的矩阵:

x = torch.rand(5, 3)
x
tensor([[0.0816, 0.3339, 0.7984],
        [0.0912, 0.8468, 0.7928],
        [0.5448, 0.3244, 0.7647],
        [0.7238, 0.5896, 0.2261],
        [0.2130, 0.9357, 0.5388]])

构造一个填充零且 dtype 是 long 的矩阵:

x = torch.zeros(5, 3, dtype=torch.long)
x
tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]])

从数据中直接构造 tensor:

x = torch.tensor([5.5, 3])
x
tensor([5.5000, 3.0000])

或基于现有 tensor 创建 tensor。 这些方法将重用输入 tensor 的属性,例如 dtype,除非用户提供新值

x = x.new_ones(
    5, 3,
    dtype=torch.double
) # new_* 方法接受数组大小
x
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]], dtype=torch.float64)
x = torch.randn_like(
    x,
    dtype=torch.float,
) # 覆盖 dtype,结果有相同的大小
x
tensor([[-0.8441,  1.5055,  2.3099],
        [-0.9477,  0.4263, -0.6931],
        [ 0.1584,  0.1401, -0.0891],
        [-1.1389,  0.9926,  1.1446],
        [ 0.1368, -0.4757,  0.0331]])

获取大小

x.size()
torch.Size([5, 3])

torch.Size 实际是一个 tuple,支持 tuple 的所有操作

操作

操作有多种语法。在下面的示例中,我们将看一下加法运算。

加法:语法 1

y = torch.rand(5, 3)
x + y
tensor([[-0.3090,  2.4941,  3.2941],
        [-0.1712,  0.4679, -0.1307],
        [ 0.8043,  0.4885,  0.6725],
        [-0.7722,  1.3460,  1.9734],
        [ 0.2231, -0.0844,  0.5018]])

加法:语法 2

torch.add(x, y)
tensor([[-0.3090,  2.4941,  3.2941],
        [-0.1712,  0.4679, -0.1307],
        [ 0.8043,  0.4885,  0.6725],
        [-0.7722,  1.3460,  1.9734],
        [ 0.2231, -0.0844,  0.5018]])

加法:提供输出 tensor 作为参数

result = torch.empty(5, 3)
torch.add(x, y, out=result)
result
tensor([[-0.3090,  2.4941,  3.2941],
        [-0.1712,  0.4679, -0.1307],
        [ 0.8043,  0.4885,  0.6725],
        [-0.7722,  1.3460,  1.9734],
        [ 0.2231, -0.0844,  0.5018]])

加法:就地

# 将 x 加到 y
y.add_(x)
y
tensor([[-0.3090,  2.4941,  3.2941],
        [-0.1712,  0.4679, -0.1307],
        [ 0.8043,  0.4885,  0.6725],
        [-0.7722,  1.3460,  1.9734],
        [ 0.2231, -0.0844,  0.5018]])

任何使 tensor 就地发生变化的操作都将使用 _。 例如 x.copy_(y), x.t_(), 将改变 x

您可以对所有的 钟声 使用标准的类似 NumPy 的索引!

x[:, 1]
tensor([ 1.5055,  0.4263,  0.1401,  0.9926, -0.4757])

调整大小:如果要调整/变换 tensor 大小,可以使用 torch.view

x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)
x.size(), y.size(), z.size()
(torch.Size([4, 4]), torch.Size([16]), torch.Size([2, 8]))

如果有一个元素的 tensor,请使用 .item() 获取该值的 Python 数字

x = torch.randn(1)
print(x)
print(x.item())
tensor([0.9833])
0.9833223819732666

扩展阅读

这里 介绍了 100 多个 Tensor 运算,包括转置,索引,切片,数学运算,线性代数,随机数等。

Numpy 桥

将 Torch Tensor 转换为 NumPy 数组很容易,反之亦然。

Torch Tensor 和 NumPy 数组将共享其底层内存位置(如果 Torch Tensor 在 CPU 上),并且更改一个将更改另一个。

将 Torch Tensor 转换为 NumPy 数组

a = torch.ones(5)
a
tensor([1., 1., 1., 1., 1.])
b = a.numpy()
b
array([1., 1., 1., 1., 1.], dtype=float32)

查看 numpy 数组的值如何变化

a.add_(1)
print(a)
print(b)
tensor([2., 2., 2., 2., 2.])
[2. 2. 2. 2. 2.]

将 NumPy 数组转换为 Torch Tensor

import numpy as np

a = np.ones(5)
b = torch.from_numpy(a)

np.add(a, 1, out=a)

print(a)
print(b)
[2. 2. 2. 2. 2.]
tensor([2., 2., 2., 2., 2.], dtype=torch.float64)

除了 CharTensor 之外,CPU 上的所有 Tensor 都支持转换为 NumPy 并支持反向转换。

CUDA Tensors

张量可以使用 .to 方法移动到任何设备上。

请在 CUDA 可用时运行此单元格。

我们将使用 torch.device 对象将 Tensor 移入和移出 GPU

if torch.cuda.is_available():
    
    # CUDA 设备对象
    device = torch.device("cuda")
    
    # 直接在 GPU 上创建一个 tensor
    y = torch.ones_like(x, device=device)
    
    # 或者是哦那个字符串 ``.to("cuda")``
    x = x.to(device)
    
    z = x + y
    
    print(z)
    
    # ``.to`` 也可以一起改变 dtype
    print(z.to("cpu", torch.double))
tensor([1.9833], device='cuda:0')
tensor([1.9833], dtype=torch.float64)

参考

https://github.com/pytorch/tutorials

https://pytorch.org/tutorials/beginner/blitz/tensor_tutorial.html#sphx-glr-beginner-blitz-tensor-tutorial-py