暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PyTorch教程:什么是PyTorch

旺德福居 2020-06-06
215

本文翻译自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 运算,包括转置,索引,切片,数学运算,线性代数,随机数等。

https://pytorch.org/docs/stable/torch.html

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

https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html



题图由苏畅在 Pixabay 上发布。
文章转载自旺德福居,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论