1. O que é PyTorch
Ele é um pacote de computação científica baseado em Python. Existem dois tipos de usuários-alvo
- Para usar GPU em vez de numpy
- Uma plataforma de pesquisa de aprendizado profundo: fornecendo o máximo de flexibilidade e velocidade
Começar
Tensores
Tensores são semelhantes a ndarrays entorpecidos, a diferença é que os tensores podem usar GPU para acelerar os cálculos
from __future__ import print_function
import torch
Construa uma matriz 5 * 3 não inicializada:
x = torch.Tensor(5, 3)
print(x)
输出:
tensor([[ 0.0000e+00, 0.0000e+00, 1.3004e-42],
[ 0.0000e+00, 7.0065e-45, 0.0000e+00],
[-3.8593e+35, 7.8753e-43, 0.0000e+00],
[ 0.0000e+00, 1.8368e-40, 0.0000e+00],
[-3.8197e+35, 7.8753e-43, 0.0000e+00]])
Construa uma matriz zero, usando o tipo longo
x = torch.zeros(5, 3, dtype=torch.long)
print(x)
输出:
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
Construa um tensor diretamente dos dados:
x = torch.tensor([5.5, 3])
print(x)
输出:
tensor([5.5000, 3.0000])
Ou construa um tensor a partir de um tensor existente. Esses métodos reutilizarão os atributos do tensor de entrada, por exemplo, dtype, a menos que o usuário forneça um novo valor
x = x.new_ones(5, 3, dtype=torch.double) # new_* methods take in sizes
print(x)
x = torch.randn_like(x, dtype=torch.float) # 覆盖类型!
print(x) # result 的size相同
输出:
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
tensor([[ 1.1701, -0.8342, -0.6769],
[-1.3060, 0.3636, 0.6758],
[ 1.9133, 0.3494, 1.1412],
[ 0.9735, -0.9492, -0.3082],
[ 0.9469, -0.6815, -1.3808]])
Pegue o tamanho do tensor
print(x.size())
输出:
torch.Size([5, 3])
Nota
torch.Size
Na verdade, é uma tupla, portanto, suporta todas as operações em tuplas.
operativo
Existem várias formas gramaticais de operações em tensores. Vamos usar a adição como um exemplo para explicar.
Grammar 1
y = torch.rand(5, 3)
print(x + y)
输出:
tensor([[ 1.7199, -0.1819, -0.1543],
[-0.5413, 1.1591, 1.4098],
[ 2.0421, 0.5578, 2.0645],
[ 1.7301, -0.3236, 0.4616],
[ 1.2805, -0.4026, -0.6916]])
Grammar Two
print(torch.add(x, y))
输出:
tensor([[ 1.7199, -0.1819, -0.1543],
[-0.5413, 1.1591, 1.4098],
[ 2.0421, 0.5578, 2.0645],
[ 1.7301, -0.3236, 0.4616],
[ 1.2805, -0.4026, -0.6916]])
Sintaxe 3:
Dê um tensor de saída como parâmetro
result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)
输出:
tensor([[ 1.7199, -0.1819, -0.1543],
[-0.5413, 1.1591, 1.4098],
[ 2.0421, 0.5578, 2.0645],
[ 1.7301, -0.3236, 0.4616],
[ 1.2805, -0.4026, -0.6916]])
Sintaxe 4:
Operação no local (no local)
# 把x加到y上
y.add_(x)
print(y)
输出:
tensor([[ 1.7199, -0.1819, -0.1543],
[-0.5413, 1.1591, 1.4098],
[ 2.0421, 0.5578, 2.0645],
[ 1.7301, -0.3236, 0.4616],
[ 1.2805, -0.4026, -0.6916]])
Nota
Qualquer operação que altera um tensor local possui um _
sufixo. Por exemplo x.copy_(y)
, a x.t_()
operação mudará x.
Você pode usar todas as numpy
operações de índice.
Você pode usar várias funções sofisticadas de indexação semelhantes ao NumPy padrão
print(x[:, 1])
输出:
tensor([-0.8342, 0.3636, 0.3494, -0.9492, -0.6815])
Redimensionar: Se quiser redimensionar / remodelar o tensor, você pode usar torch.view
:
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8) # -1的意思是没有指定维度
print(x.size(), y.size(), z.size())
输出:
torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])
Se você tiver um único tensor de elemento, use .item()
o valor como um número Python
x = torch.randn(1)
print(x)
print(x.item())
输出:
tensor([0.3441])
0.34412217140197754
Leia mais tarde
Existem mais de cem operações de tensor descritas aqui , incluindo transposição, indexação, operações matemáticas, álgebra linear, números aleatórios, etc.
ponte entorpecida
Converter um tensor de tocha em uma matriz numpy ou vice-versa é fácil.
Tensores de tocha e matrizes entorpecidas compartilharão memória potencial, e mudar um também mudará o outro.
Converter tensor da tocha em matriz numpy
a = torch.ones(5)
print(a)
输出:
tensor([1., 1., 1., 1., 1.])
b = a.numpy()
print(b)
print(type(b))
输出:
[ 1. 1. 1. 1. 1.]
<class 'numpy.ndarray'>
Por meio das operações a seguir, vemos como o valor da matriz numpy muda.
a.add_(1)
print(a)
print(b)
输出:
tensor([2., 2., 2., 2., 2.])
[ 2. 2. 2. 2. 2.]
Converter matriz numpy em tensor de tocha
Veja como alterar a matriz numpy altera automaticamente o tensor da tocha.
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)
Todos os tensores na CPU, exceto os tensores de caracteres, oferecem suporte à conversão entre numpy.
Tensor CUDA
Você pode usar o método .to para mover o tensor para qualquer dispositivo.
# let us run this cell only if CUDA is available
# We will use ``torch.device`` objects to move tensors in and out of GPU
if torch.cuda.is_available():
device = torch.device("cuda") # a CUDA device object
y = torch.ones_like(x, device=device) # directly create a tensor on GPU
x = x.to(device) # or just use strings ``.to("cuda")``
z = x + y
print(z)
print(z.to("cpu", torch.double)) # ``.to`` can also change dtype together!
输出:
tensor([1.3441], device='cuda:0')
tensor([1.3441], dtype=torch.float64)