Topic 2 of 6

Course materials are currently available in Russian only.

Тензоры

PyTorch — самая популярная библиотека для нейросетей: на ней сделаны ChatGPT-подобные модели, Stable Diffusion, автопилоты. Её любят за то, что код на ней — обычный Python.

В курсе вы соберёте сеть, распознающую рукописные цифры: тензоры, производные, слои, обучение и данные. Видеокарта не нужна — всё работает на процессоре.

Тензор

Тензор — многомерный массив чисел, как массив NumPy, но умеющий считать производные и работать на видеокарте.

import torch

a = torch.tensor([[1, 2, 3], [4, 5, 6]])     # из списка
z = torch.zeros(32, 28, 28)                  # нули
r = torch.rand(3, 4)                         # случайные из [0, 1)
n = torch.arange(10)                         # 0, 1, …, 9

a.shape      # torch.Size([2, 3])
a.dtype      # torch.int64
a.float()    # тот же тензор с float32

Картинка 28×28 — тензор формы (28, 28), пакет из 32 картинок — (32, 28, 28). Первое измерение пакета — номер примера.

Типы

Сети работают с float32. Картинки обычно хранятся байтами uint8 (0…255), поэтому их превращают в дробные:

x = pixels.float() / 255       # 0…1

В PyTorch / всегда даёт дробный результат, а // — целочисленный.

Операции

a + b, a * b, a ** 2          # поэлементно
a @ b                         # матричное умножение
a.sum(), a.mean(), a.max()    # по всему тензору
a.sum(dim=1)                  # по строкам: результат — по числу на строку
x * 2 + 1                     # число «растягивается» на весь тензор (broadcasting)

dim — измерение, вдоль которого идёт операция: для матрицы dim=0 — вдоль столбцов, dim=1 — вдоль строк.

Форма

t = torch.arange(12)
t.reshape(3, 4)               # 3 строки по 4
t.reshape(3, -1)              # -1 — «посчитай сам»
batch.reshape(batch.shape[0], -1)     # (N, 28, 28) → (N, 784)

reshape (и похожий view) не меняет числа, только то, как они разложены. Число элементов должно совпасть.

Индексы и выбор

x[0]            # первая строка
x[:, 2]         # третий столбец
x[x > 0.5]      # элементы больше 0.5
logits.argmax(dim=1)          # номер наибольшего в каждой строке
(pred == labels).float().mean()       # доля совпадений
t.item()        # тензор из одного числа → число Python
t.tolist()      # тензор → списки Python

Как проверяются задачи

Как и в других курсах на компьютере, задача — готовая программа с исправляемым участком. Проверка вызывает ваши функции на своих данных, а «Запустить у себя» показывает небольшую демонстрацию. Первый запуск PyTorch может занять несколько секунд — библиотека большая.

Итог

  • torch.tensor, zeros, rand, arange; shape, dtype, float();
  • поэлементные операции, sum(dim=…), @;
  • reshape(N, -1);
  • argmax(dim=1), сравнение и .float().mean(), .item(), .tolist().