Основные операции NumPy для глубокого обучения: +, -, *, /, **, сравнение, sum/mean/max/min, axis

1. Зачем сначала освоить базовые операции?



В глубоком обучении мы в итоге делаем:

  • Суммируем входы/веса (+)
  • Умножаем (*, матричное умножение)
  • Применяем нелинейные функции (**, relu, sigmoid и т.д.)
  • Вычисляем потерю (loss), а затем берём среднее (mean) или **сумму (sum)

PyTorch‑тензорные операции следуют за стилем базовых операций NumPy, поэтому, если вы уже знакомы с NumPy, формулы в глубоких сетях выглядят более естественно.


2. Арифметические операции по элементам: +, -, *, /, **

Базовые операции между массивами NumPy выполняются поэлементно.

import numpy as np

x = np.array([1, 2, 3])
y = np.array([10, 20, 30])

print(x + y)   # [11 22 33]
print(x - y)   # [ -9 -18 -27]
print(x * y)   # [10 40 90]
print(y / x)   # [10. 10. 10.]
print(x ** 2)  # [1 4 9]
  • Массивы одинаковой длины 1‑D: операция по элементам
  • 2‑D, 3‑D и выше: аналогично, элементы с одинаковыми индексами

2.1 Операции со скаляром

Операции со скаляром (одним числом) тоже работают гладко.

x = np.array([1, 2, 3])

print(x + 10)   # [11 12 13]
print(x * 2)    # [2 4 6]
print(x / 2)    # [0.5 1.  1.5]

Такие «добавить/умножить одинаковое значение ко всем элементам» часто используются в глубоких сетях для нормализации, масштабирования, добавления смещения и т.п.

Тензоры PyTorch работают так же. Выражения вроде x_t + y_t, x_t * 2, x_t ** 2 почти идентичны.


3. Сравнительные операции: >, <, >=, <=, ==, !=



Сравнение массивов NumPy возвращает булевый массив.

import numpy as np

x = np.array([1, 2, 3, 4, 5])

print(x > 3)   # [False False False  True  True]
print(x == 2)  # [False  True False False False]

Этот булевый массив можно:

  • Использовать как маску для выбора элементов
  • Подсчитывать количество удовлетворяющих условию элементов

Пример:

x = np.array([1, -2, 3, 0, -5, 6])

mask = x > 0
print(mask)          # [ True False  True False False  True]

# Выбор положительных
pos = x[mask]
print(pos)           # [1 3 6]

# Количество положительных
num_pos = np.sum(mask)   # True=1, False=0
print(num_pos)           # 3

В глубоких сетях часто применяют:

  • Точность (accuracy) – сравнение предсказаний с истинными
  • Включение только тех позиций, которые удовлетворяют условию, в расчёт потерь

PyTorch использует аналогичный шаблон.


4. Агрегатные функции: np.sum, np.mean, np.max, np.min

4.1 Без указания axis: расчёт по всему массиву

По умолчанию функции работают над весьма массивом.

import numpy as np

x = np.array([1, 2, 3, 4])

print(np.sum(x))   # 10
print(np.mean(x))  # 2.5
print(np.max(x))   # 4
print(np.min(x))   # 1

Для массивов более 2‑D результат аналогичен.

X = np.array([[1, 2, 3],
              [4, 5, 6]])

print(np.sum(X))   # 21
print(np.mean(X))  # 3.5

В глубоких сетях применяют:

  • Среднее значение потерь по всей партии/всей выборке
  • Нормализацию по среднему/стандартному отклонению

5. Понимание axis

axis определяет, по какой оси выполнять операцию.

  • Без axis → расчёт по всем элементам
  • С axis → сокращение по указанной оси, остальные остаются

5.1 Пример с 2‑D массивом

import numpy as np

X = np.array([[1, 2, 3],
              [4, 5, 6]])  # shape: (2, 3)

axis=0: расчёт по столбцам

print(np.sum(X, axis=0))   # [5 7 9]
print(np.mean(X, axis=0))  # [2.5 3.5 4.5]
  • Результат имеет форму (3,)
  • Считается сумма/среднее по каждому столбцу
  • В глубоких сетях часто используют для расчёта средних/стандартных отклонений по признакам

axis=1: расчёт по строкам

print(np.sum(X, axis=1))   # [ 6 15]
print(np.mean(X, axis=1))  # [2. 5.]
  • Результат имеет форму (2,)
  • Считается сумма/среднее по каждой строке
  • Связано с средним/суммой по каждому образцу

5.2 Часто встречающиеся примеры axis в глубоких сетях

Предположим, у нас есть батч данных:

# (batch_size, feature_dim)
X = np.random.randn(32, 10)  # 32 образца, 10 признаков
  1. Среднее по признакам
mean_per_feature = np.mean(X, axis=0)  # shape: (10,)
  • axis=0 → сокращение по батчу
  • Получаем среднее значение каждого признака
  1. Среднее по образцам
mean_per_sample = np.mean(X, axis=1)  # shape: (32,)
  • axis=1 → сокращение по признакам
  • Получаем среднее значение каждого образца

5.3 axis в батче изображений

Батч изображений в стиле PyTorch (N, C, H, W) можно представить в NumPy так же.

# N=32, C=3 (RGB), H=W=64
images = np.random.randn(32, 3, 64, 64)

Примеры:

  1. Максимум по всем пикселям
global_max = np.max(images)  # скаляр
  1. Среднее по каналам (RGB)
# axis=(0, 2, 3): сокращаем батч, высоту, ширину, оставляем канал
channel_mean = np.mean(images, axis=(0, 2, 3))  # shape: (3,)

Такой подход часто используют для нормализации по каналам.


6. Агрегатные функции + сравнение: типичные шаблоны

6.1 Вычисление точности (accuracy)

Для бинарной классификации:

import numpy as np

# Предсказания (не логиты, а вероятности 0–1)
pred = np.array([0.2, 0.8, 0.9, 0.3])
# Истинные метки (0 или 1)
target = np.array([0, 1, 1, 0])

# Классы по порогу 0.5
pred_label = (pred > 0.5).astype(np.int32)   # [0 1 1 0]

# Точность
correct = (pred_label == target)             # [ True True True True]
accuracy = np.mean(correct)                  # True=1, False=0
print(accuracy)  # 1.0
  • Сравнение → булевый массив
  • mean → точность

PyTorch реализует почти такой же код.

6.2 Потери с маской

loss = np.array([0.1, 0.5, 0.2, 0.9])
mask = np.array([True, False, True, False])

masked_loss = loss[mask]      # [0.1, 0.2]
mean_loss = np.mean(masked_loss)
print(mean_loss)              # 0.15000000000000002

Маски позволяют включать только нужные позиции в расчёт потерь.


7. Итоги: основные операции, которые вы изучили

  1. Арифметика (+, -, *, /, **) * Поэлементно, со скаляром
  2. Сравнение (>, <, >=, <=, ==, !=) * Возвращает булевый массив → маски, подсчёт, точность
  3. Агрегатные функции (np.sum, np.mean, np.max, np.min) * Без axis: по всему массиву * С axis: по выбранной оси
  4. axis * 2‑D: axis=0 – столбцы, axis=1 – строки * В глубоких сетях: (batch, feature), (N, C, H, W) * Используется для статистики по признакам, образцам, каналам

Овладев этими базовыми операциями, вы сможете быстро переводить математические формулы в код NumPy/PyTorch, а также писать более понятные и эффективные расчёты потерь, точности и нормализации.

image