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)