Основные операции 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 признаков
- Среднее по признакам
mean_per_feature = np.mean(X, axis=0) # shape: (10,)
axis=0→ сокращение по батчу- Получаем среднее значение каждого признака
- Среднее по образцам
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)
Примеры:
- Максимум по всем пикселям
global_max = np.max(images) # скаляр
- Среднее по каналам (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. Итоги: основные операции, которые вы изучили
- Арифметика (
+,-,*,/,**) * Поэлементно, со скаляром - Сравнение (
>,<,>=,<=,==,!=) * Возвращает булевый массив → маски, подсчёт, точность - Агрегатные функции (
np.sum,np.mean,np.max,np.min) * Безaxis: по всему массиву * Сaxis: по выбранной оси axis* 2‑D:axis=0– столбцы,axis=1– строки * В глубоких сетях:(batch, feature),(N, C, H, W)* Используется для статистики по признакам, образцам, каналам
Овладев этими базовыми операциями, вы сможете быстро переводить математические формулы в код NumPy/PyTorch, а также писать более понятные и эффективные расчёты потерь, точности и нормализации.

Комментариев нет.