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:

  1. 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
  2. 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 1 de um tensor
  • Unsqueeze – adiciona uma dimensão de tamanho 1 em 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.