Понимание одной из ключевых концепций NumPy, PyTorch и TensorFlow

Широковещательная рассылка - это операция сопоставления размеров массивов разной формы, чтобы иметь возможность выполнять дальнейшие операции с этими массивами (например, арифметические операции для каждого элемента).

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

Простейшим примером широковещательной рассылки является умножение n-мерного массива на скаляр, что, очевидно, означает поэлементное умножение его элементов на скалярное значение:

Широковещательная передача сродни хорошо известному «продвижению типа»: в большинстве языков при добавлении целого числа и числа с плавающей запятой оно сначала автоматически преобразуется в тип с плавающей запятой.

В 2D (например, деление матрицы на вектор) широковещательная передача несколько сложнее, поскольку результат операции зависит от конкретных форм операндов:

Все эти изменения формы (цифры серого цвета) происходят «на лету», не занимая дополнительной памяти (также известной как просмотры).

В 3D и выше вещание еще менее интуитивно понятно, и его использование требует знания правил вещания в их общей форме. Они были сформулированы несколько по-разному в разных источниках, и точная формулировка была изменена со временем. Я считаю, что трехэтапные правила из Справочника по науке о данных Python ¹ являются наиболее полными:

Правило 1. Если два массива различаются по количеству измерений, форма массива с меньшим размером дополняется единицами на его передней (левой) стороне.

Правило 2: Если форма двух массивов не совпадает ни в одном измерении, массив с формой, равной 1 в этом измерении, растягивается, чтобы соответствовать другой форме.

Правило 3: Если в каком-либо измерении размеры не совпадают и ни один из них не равен 1, возникает ошибка.

Растяжка означает, что соответствующие слои дублируются:

Преобразование цветного изображения в оттенки серого ² - хороший пример 3D-трансляции. Согласно формуле для цветового пространства sRGB яркость можно получить за счет линейных комбинаций цветовых каналов изображения:

При использовании широковещательной передачи это очень просто:

где im - изображение со стандартным порядком индексов, например, если im.shape == (1080, 1920, 3), то gray.shape == (1080, 1920), где 1080 - высота изображения, 1920 - его ширина и 3 - количество цветовых плоскостей (RGB). Полный пример:

Есть специальная функция np.broadcast³, которая возвращает объект-генератор.

хотя трансляция редко выполняется явно (поскольку цикл будет выполняться в Python, который медленнее, чем в C). Обычно это происходит «за кадром».

Но вещание не ограничивается арифметическими операциями. См. Больше примеров использования в моей статье Numpy Illustrated ⁴ »

Широковещательная передача была первоначально представлена ​​в библиотеке под названием Numeric⁵, предшественнице NumPy, где-то в 1995–1999 годах, принята на вооружение PyTorch, TensorFlow, Keras и так далее. Даже Matlab добавил это в 2016b благодаря пользователям, которые просили такое поведение на протяжении многих лет.

Отзывы

  1. Джейк Вандерплас. Справочник Python по науке о данных, Вычисления на массивах: широковещательная передача
  2. Википедия. Оттенки серого
  3. Документация NumPy. Вещание
  4. Лев Максимов (2020). Numpy Illustrated: Наглядное руководство по NumPy
  5. Дэвид Ашер; Поль Ф. Дюбуа; Конрад Хинсен; Джим Хугунин; Трэвис Олифант (1999). Числовой питон »