NumPy для начинающих в глубоком обучении: почему стоит изучить его до PyTorch

Почему новичкам в глубоком обучении стоит сначала изучить NumPy?



В большинстве книг и курсов по глубоком обучению сразу вводят PyTorch, TensorFlow и другие фреймворки. Но при работе с моделями часто возникает ощущение:

  • "Что такое тензор?"
  • "Почему возникает ошибка несовпадения shape?"
  • "Как правильно сформировать батч?"

Большая часть путаницы появляется, когда вы переходите сразу к фреймворку, не осознав основы NumPy.

  • Tensor в PyTorch почти идентичен ndarray в NumPy
  • Предобработка данных, создание батчей, статистика – всё это всё ещё требует мышления в стиле NumPy

Если вы хотите действительно понять глубину глубинного обучения, NumPy – почти обязательный фундамент.


Что такое NumPy?

NumPy (Numerical Python) – библиотека, позволяющая быстро выполнять численные расчёты в Python.

Ключевые особенности:

  • Многомерные массивы (ndarray): вектор, матрица, тензор
  • Векторизованные операции: без for‑циклов
  • Бродкастинг: умные операции между массивами разного shape
  • Линейная алгебра: матричное умножение, транспонирование, обратная матрица
  • Модуль случайных чисел: генерация, нормальное распределение, случайная инициализация

Поскольку почти все формулы в глубоком обучении сводятся к операциям над векторами и матрицами, NumPy можно назвать «языком» глубинного обучения.


Python‑список vs. массив NumPy



Сравним простые примеры.

# Python‑список
A = [1, 2, 3, 4]
B = [10, 20, 30, 40]
print(A + B)  # [1, 2, 3, 4, 10, 20, 30, 40] – конкатенация
import numpy as np
A = np.array([1, 2, 3, 4])
B = np.array([10, 20, 30, 40])
print(A + B)  # [11 22 33 44] – элементное сложение

Операция + в NumPy ведёт себя так, как ожидает математика, и тензоры в PyTorch следуют той же модели.


Векторизация: меньше циклов, код как формула

В глубоком обучении часто рекомендуют минимизировать for‑циклы и использовать векторизацию.

Python‑список + цикл

data = [1, 2, 3, 4, 5]
squared = []
for x in data:
    squared.append(x ** 2)
print(squared)  # [1, 4, 9, 16, 25]

NumPy‑векторизация

import numpy as np

data = np.array([1, 2, 3, 4, 5])
squared = data ** 2
print(squared)  # [ 1  4  9 16 25]
  • Код короче
  • Читается как математическое выражение
  • Выполняется на C‑уровне, быстрее

Тензоры PyTorch используют тот же подход.


Бродкастинг: работа с разными shape

Бродкастинг – правило, позволяющее автоматически подгонять массивы разного размера.

import numpy as np
x = np.array([[1, 2, 3],
              [4, 5, 6]])   # shape: (2, 3)

b = np.array([10, 20, 30])  # shape: (3,)

y = x + b
print(y)
# [[11 22 33]
#  [14 25 36]]

NumPy «разворачивает» b до (2, 3) и выполняет операцию. В PyTorch работает аналогично.


Вектор, матрица, тензор: как их представлять в NumPy

  • Вектор – одномерный массив: shape: (N,)
  • Матрица – двумерный массив: shape: (M, N)
  • Тензор – массив 3‑х и более измерений

Пример: пакет изображений

batch_size = 32
# черно‑белые изображения 28x28
shape = (batch_size, 28, 28)

Простой матричный умножение

import numpy as np
x = np.array([1.0, 2.0, 3.0])           # shape: (3,)
W = np.array([[0.1, 0.2, 0.3],
              [0.4, 0.5, 0.6]])        # shape: (2, 3)
y = W @ x
print(y)  # [1.4 3.2]

Это эквивалент однопользовательного линейного слоя.


Как связаны NumPy и PyTorch?

1. Тензор и ndarray – «сестринские» объекты

  • Оба – многомерные массивы с векторизованными операциями
  • Функции: shape, reshape, transpose, sum, mean – почти одинаковые

Многие используют NumPy как «практикум» для понимания PyTorch.

2. Предобработка данных обычно в стиле NumPy

Частые задачи:

  • Чтение CSV, изображений, логов
  • Преобразование в числовой формат
  • Нормализация, стандартизация, разбиение на батчи

Обычно это делается с NumPy + pandas.

import numpy as np
import torch
np_data = np.random.randn(100, 3)
tensor_data = torch.from_numpy(np_data).float()
print(tensor_data.shape)  # torch.Size([100, 3])

И наоборот, можно вернуть тензор в NumPy:

y = tensor_data.mean(dim=0)
y_np = y.detach().cpu().numpy()

3. GPU‑вычисления – PyTorch, концептуальная практика – NumPy

  • PyTorch работает на GPU и поддерживает автодифференцирование
  • NumPy – CPU‑ориентирован, но проще для отладки и экспериментов

Обычно сначала прототипируют в NumPy, потом переводят в PyTorch.


Часто используемые шаблоны NumPy в глубоком обучении

1. Случайная инициализация и шум

import numpy as np
W = np.random.randn(3, 3) * 0.01
x = np.array([1.0, 2.0, 3.0])
noise = np.random.normal(0, 0.1, size=x.shape)
x_noisy = x + noise

2. Нормализация данных

X = np.random.randn(100, 3) * 10 + 50
mean = X.mean(axis=0)
std = X.std(axis=0)
X_norm = (X - mean) / (std + 1e-8)

3. One‑hot кодирование

num_classes = 4
labels = np.array([0, 2, 1, 3])
one_hot = np.eye(num_classes)[labels]
print(one_hot)
# [[1. 0. 0. 0.]
#  [0. 0. 1. 0.]
#  [0. 1. 0. 0.]
#  [0. 0. 0. 1.]]

4. Разбиение на батчи

X = np.random.randn(100, 3)
batch_size = 16
for i in range(0, len(X), batch_size):
    batch = X[i:i+batch_size]
    # batch можно подавать в модель

Что важно знать при изучении NumPy

Не нужно охватывать всё, достаточно фокусироваться на:

  1. ndarray: np.array, dtype, shape, reshape, astype
  2. Индексация & срезы: x[0], x[1:3], x[:, 0], x[:, 1:3], логические индексы
  3. Базовые операции: +, -, *, /, **, сравнения, np.sum, np.mean, axis
  4. Линейная алгебра: @, np.dot, x.T
  5. Бродкастинг: скаляры, (N, D) + (D,), (N, 1)
  6. Случайные функции: np.random.randn, np.random.randint, np.random.permutation
  7. Связь с PyTorch: torch.from_numpy, tensor.numpy()

После освоения этих пунктов большинство операций в PyTorch станет понятнее.


Итог: NumPy – «язык» глубинного обучения

  • NumPy – библиотека для численных расчётов
  • Tensor в PyTorch – это «глубинная» версия ndarray
  • Освоив векторизацию, бродкастинг и линейную алгебру в NumPy, вы:
  • Сократите ошибки shape
  • Упростите перенос формул из статей в код
  • Улучшите навыки предобработки и анализа данных

Если вы хотите понять глубинное обучение не только как набор команд, но и как математику, NumPy – лучший старт.

image of a dev researching deep-learning