Intuito do post
Servir como um guia de referência para PyTorch e Machine Learning.
Pretendo atualizar esse post conforme eu for evoluindo no PyTorch.
O que é o PyTorch?
PyTorch é uma biblioteca de machine learning desenvolvida pelo Facebook AI Research (FAIR). Ela é amplamente utilizada para tarefas de aprendizado profundo (deep learning) e oferece uma interface flexível e dinâmica para a construção e treinamento de redes neurais.
O que são Tensores?
Os tensores são estruturas de dados fundamentais em machine learning que generalizam números, vetores e matrizes para múltiplas dimensões. Eles servem para representar e processar dados numéricos de forma eficiente, sendo usados para armazenar entradas, pesos e saídas de modelos de aprendizado de máquina. Em frameworks como TensorFlow e PyTorch, os tensores permitem realizar operações matemáticas em larga escala e de maneira otimizada, especialmente em GPUs, além de possibilitar o cálculo automático de gradientes, essencial para o treinamento de redes neurais.
Tipos de Tensores
Matrix: uma tabela de valores com linhas e colunas (2D)
MATRIX = torch.tensor([[7, 8],
[9, 10]])
Tensor: uma generalização de matrizes para mais dimensões (3D ou superior)
TENSOR = torch.tensor([[[1, 2, 3],
[3, 6, 9],
[2, 4, 5]]])
Criação de Tensores
Tensor aleatório:
# Cria um tensor de tamanho (3, 4) com valores aleatórios
random_tensor = torch.rand(3, 4)
Tensor cheio de zeros:
zeros = torch.zeros(size=(3, 4))
Tensor a partir de um range:
one_to_ten = torch.arange(start=1, end=11, step=1)
# tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
Tensor-like cheio de zeros:
ten_zeroes = torch.zeros_like(one_to_ten)
# tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
Atributos dos Tensores
Extraindo informação sobre os Tensores (tensor attributes):
- Número de dimensões de um Tensor:
tensor.ndim - Formato de um Tensor:
tensor.shape - Tipo de dado um Tensor:
tensor.dtype - Dispositivo que o Tensor está:
tensor.device
Manipulação de Tensores
Operações Básicas
Adição:
# Cria um tensor e adiciona 10 de todos seus elementos
tensor = torch.tensor([1, 2, 3])
tensor + 10
# tensor([11, 12, 13])
Subtração:
# Subtrai 10 de todos seus elementos
tensor - 10
# tensor([-9, -8, -7])
Multiplicação (element-wise):
# Multiplica todos seus elementos por 10
tensor * 10
Divisão:
# Divide todos os elementos por 10
tensor / 10
Multiplicação de Matrizes
Existem duas regras principais para executar uma multiplicação de matrizes:
As dimensões de dentro devem ser iguais:
(3, 2) @ (3, 2)não funciona(2, 3) @ (3, 2)funciona pois as dimensões de dentro são iguais
A matriz resultante terá o formato das dimensões mais externas:
(2, 3) @ (3, 2)→(2, 2)(3, 2) @ (2, 3)→(3, 3)
# Executando multiplicação de matrizes
torch.matmul(tensor, tensor)
Transposição de Matrizes
A transposição troca as linhas pelas colunas de uma matriz, alterando sua orientação. Ela é útil, por exemplo, quando precisamos ajustar as dimensões para que duas matrizes possam ser multiplicadas.
# Transpondo uma matriz
tensor_t = tensor.T # ou tensor.transpose(0, 1)
Exemplo:
tensor.shape = (2, 3)tensor_t.shape = (3, 2)
Com isso, agora é possível fazer:
torch.matmul(tensor, tensor_t) # (2, 3) @ (3, 2) -> (2, 2)
Agregação de Tensores
A agregação de tensores combina valores em um único resultado aplicando funções como mínimo, máximo, média ou soma sobre uma ou mais dimensões.
torch.min(tensor) # menor valor
torch.max(tensor) # maior valor
torch.mean(tensor) # média dos valores
torch.sum(tensor) # soma de todos os valores
Encontrando Posições
Encontrando a posição do mínimo e do máximo:
tensor.argmin() # índice do valor mínimo
tensor.argmax() # índice do valor máximo
Reformatação e Ajuste de Dimensões
Operações para reformatar, empilhar e ajustar dimensões de tensores:
- Reshape – redefine o formato de um tensor para uma nova forma especificada
- View – cria uma view (visão) do tensor com outra forma, sem copiar os dados na memória
- Stack – empilha múltiplos tensores, seja um sobre o outro (verticalmente) ou lado a lado (horizontalmente)
- Squeeze – remove todas as dimensões com tamanho
1de um tensor - Unsqueeze – adiciona uma dimensão de tamanho
1em uma posição específica - Permute – retorna uma view do tensor com as dimensões trocadas em uma nova ordem
# Exemplos serão adicionados conforme o aprendizado progride
Este post será atualizado continuamente com novos conceitos e exemplos práticos.
