torch.masked
Введение
Мотивация
Предупреждение
API PyTorch для тензоров с масками находится на стадии прототипа и может быть изменен в будущем.
MaskedTensor служит расширением для torch.Tensor, предоставляя пользователю возможность:
- использовать любые семантики масок (например, тензоры переменной длины, операции с NaN и т.д.)
- различать градиенты 0 и NaN
- различные применения разреженных данных (см. учебник ниже)
Термины «указанное» и «неуказанное» имеют давнюю историю в PyTorch без формальных семантик и, безусловно, без согласованности; на самом деле, MaskedTensor возник из накопившихся проблем, с которыми стандартный класс torch.Tensor не смог справиться должным образом. Таким образом, одной из основных целей MaskedTensor является стать источником истины для указанных и неуказанных значений в PyTorch, где они являются полноценными элементами, а не дополнениями. В свою очередь, это должно дополнительно раскрыть потенциал разреженности, обеспечить более безопасные и согласованные операции и предоставить более плавный и интуитивный опыт для пользователей и разработчиков.
Что такое MaskedTensor?
MaskedTensor — это подкласс тензора, который состоит из 1) входных данных и 2) маски. Маска указывает, какие элементы входных данных следует включать или игнорировать.
В качестве примера, предположим, что мы хотим замаскировать все значения, равные 0 (представленные серым цветом) и взять максимум:

Вверху представлен пример обычного тензора, а внизу — MaskedTensor, где все нули замаскированы. Это явно приводит к разному результату в зависимости от наличия маски, но эта гибкая структура позволяет пользователю систематически игнорировать любые элементы во время вычислений.
Уже существует ряд учебников, которые мы подготовили, чтобы помочь пользователям освоиться, например:
- Обзор — с него нужно начинать новым пользователям, обсуждает, как использовать MaskedTensor и почему они полезны
- Разреженность — MaskedTensor поддерживает разреженные данные COO и CSR, а также маски тензоров
- Семантика разреженных Adagrad — практический пример того, как MaskedTensor может упростить семантику и реализации разреженных данных
- Расширенные семантики — обсуждение причин принятых решений (например, требования, чтобы маски совпадали для бинарных/операций сведением), различия с MaskedArray в NumPy и семантики сведения
Поддерживаемые операторы
Унарные операторы
Унарные операторы — это операторы, содержащие только один вход. Их применение к MaskedTensor относительно просто: если данные замаскированы в данном индексе, мы применяем оператор, в противном случае мы продолжим маскировать данные.
Доступные унарные операторы:
abs
| Вычисляет абсолютное значение каждого элемента в |
absolute
| Псевдоним для |
acos
| Вычисляет обратный косинус каждого элемента в |
arccos
| Псевдоним для |
acosh
| Возвращает новый тензор с обратным гиперболическим косинусом элементов |
arccosh
| Псевдоним для |
angle
| Вычисляет угол (в радианах) каждого элемента заданного |
asin
| Возвращает новый тензор с арксинусом элементов |
arcsin
| Псевдоним для |
asinh
| Возвращает новый тензор с обратным гиперболическим синусом элементов |
arcsinh
| Псевдоним для |
atan
| Возвращает новый тензор с арктангенсом элементов |
arctan
| Псевдоним для |
atanh
| Возвращает новый тензор с обратным гиперболическим тангенсом элементов |
arctanh
| Псевдоним для |
bitwise_not
| Вычисляет побитовое НЕ заданного входного тензора. |
ceil
| Возвращает новый тензор с целой частью элементов |
clamp
| |
clip
| Псевдоним для |
conj_physical
| Вычисляет комплексно-сопряжённое значение каждого элемента данного |
cos
| Возвращает новый тензор с косинусом элементов |
cosh
| Возвращает новый тензор с гиперболическим косинусом элементов |
deg2rad
| Возвращает новый тензор, в котором каждый элемент из |
digamma
| Псевдоним для |
erf
| Псевдоним для |
erfc
| Псевдоним для |
erfinv
| Псевдоним для |
exp
| Возвращает новый тензор с экспонентой элементов входного тензора |
exp2
| Псевдоним для |
expm1
| Псевдоним для |
fix
| Псевдоним для |
floor
| Возвращает новый тензор с наибольшим целым числом, меньшим или равным каждому элементу из |
frac
| Вычисляет дробную часть каждого элемента в |
lgamma
| Вычисляет натуральный логарифм абсолютного значения гамма-функции для |
log
| Возвращает новый тензор с натуральным логарифмом элементов |
log10
| Возвращает новый тензор с логарифмом по основанию 10 элементов |
log1p
| Возвращает новый тензор с натуральным логарифмом (1 + |
log2
| Возвращает новый тензор с логарифмом по основанию 2 элементов |
logit
| Псевдоним для |
i0
| Псевдоним для |
isnan
| Возвращает новый тензор с булевыми элементами, представляющими собой значение TRUE, если каждый элемент |
nan_to_num
| Заменяет значения NaN, положительной и отрицательной бесконечности в |
neg
| Возвращает новый тензор с отрицанием элементов |
negative
| Псевдоним для |
positive
| Возвращает |
pow
| Возводит каждый элемент в |
rad2deg
| Возвращает новый тензор, в котором каждый элемент из |
reciprocal
| Возвращает новый тензор с обратными значениями элементов |
round
| Округляет элементы |
rsqrt
| Возвращает новый тензор с обратными значениями квадратных корней каждого элемента из |
sigmoid
| Псевдоним для |
sign
| Возвращает новый тензор со знаками элементов из |
sgn
| Эта функция является расширением torch.sign() для комплексных тензоров. |
signbit
| Проверяет, установлен ли бит знака каждого элемента |
sin
| Возвращает новый тензор с синусом элементов |
sinc
| Псевдоним для |
sinh
| Возвращает новый тензор с гиперболическим синусом элементов |
sqrt
| Возвращает новый тензор с квадратными корнями элементов |
square
| Возвращает новый тензор с квадратами элементов |
tan
| Возвращает новый тензор с тангенсом элементов |
tanh
| Возвращает новый тензор с гиперболическим тангенсом элементов |
trunc
| Возвращает новый тензор с усеченными целочисленными значениями элементов |
Доступные операторы с заменой (inplace) — все вышеперечисленные, кроме:
angle
| Вычисляет угол (в радианах) каждого элемента заданного |
positive
| Возвращает |
signbit
| Проверяет, установлен ли бит знака каждого элемента |
isnan
| Возвращает новый тензор с булевыми элементами, указывающими, является ли каждый элемент |
Бинарные операторы
Как вы могли видеть в руководстве, MaskedTensor также реализованы бинарные операции, с оговоркой, что маски в двух MaskedTensors должны совпадать, иначе будет выведено сообщение об ошибке. Как отмечено в сообщении об ошибке, если вам нужна поддержка конкретного оператора или у вас есть предложения по семантике их поведения, пожалуйста, откройте вопрос на GitHub. Пока мы решили придерживаться наиболее консервативной реализации, чтобы пользователи точно понимали, что происходит, и принимали осознанные решения в отношении маскированных семантик.
Доступные бинарные операторы:
add
| Добавляет |
atan2
| Элемент-поэлементная арктангенс от с учётом квадранта. |
arctan2
| Псевдоним для |
bitwise_and
| Вычисляет побитовое И от |
bitwise_or
| Вычисляет побитовое ИЛИ от |
bitwise_xor
| Вычисляет побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ от |
bitwise_left_shift
| Вычисляет сдвиг влево |
bitwise_right_shift
| Вычисляет сдвиг вправо |
div
| Делит каждый элемент входного |
divide
| Псевдоним для |
floor_divide
| |
fmod
| Применяет std::fmod из C++ поэлементно. |
logaddexp
| Логарифм суммы экспонент входов. |
logaddexp2
| Логарифм суммы экспонент входов в двоичной системе. |
mul
| Умножает |
multiply
| Псевдоним для |
nextafter
| Возвращает следующее значение с плавающей запятой после |
remainder
| Вычисляет модуль Python поэлементно. |
sub
| Вычитает |
subtract
| Псевдоним для |
true_divide
| Псевдоним для |
eq
| Вычисляет поэлементное равенство |
ne
| Вычисляет поэлементно. |
le
| Вычисляет поэлементно. |
ge
| Вычисляет поэлементно. |
greater
| Псевдоним для |
greater_equal
| Псевдоним для |
gt
| Вычисляет поэлементно. |
less_equal
| Псевдоним для |
lt
| Вычисляет поэлементно. |
less
| Псевдоним для |
maximum
| Вычисляет поэлементный максимум |
minimum
| Вычисляет поэлементный минимум |
fmax
| Вычисляет поэлементный максимум |
fmin
| Вычисляет поэлементный минимум |
not_equal
| Псевдоним для |
Доступные операторы бинарных операций inplace — все вышеперечисленные, кроме:
logaddexp
| Логарифм суммы экспоненциальных значений входных данных. |
logaddexp2
| Логарифм суммы экспоненциальных значений входных данных в основании 2. |
equal
|
|
fmin
| Вычисляет поэлементный минимум |
minimum
| Вычисляет поэлементный минимум |
fmax
| Вычисляет поэлементный максимум |
Сводки
Доступны следующие сводки (с поддержкой автографа). Более подробную информацию можно найти в учебнике Обзор, где приведены примеры сводок, а в учебнике Расширенная семантика — более глубокое обсуждение принятых правил семантики сводок.
sum
| Возвращает сумму всех элементов в тензоре |
mean
| Возвращает среднее значение всех элементов в тензоре |
amin
| Возвращает минимальное значение каждого среза тензора |
amax
| Возвращает максимальное значение каждого среза тензора |
argmin
| Возвращает индексы минимального(ых) значения(й) уплощенного тензора или по измерению. |
argmax
| Возвращает индексы максимального значения всех элементов в тензоре |
prod
| Возвращает произведение всех элементов в тензоре |
all
| Проверяет, вычисляются ли все элементы в |
norm
| Возвращает матричную или векторную норму данного тензора. |
var
| Вычисляет дисперсию по измерениям, указанным в |
std
| Вычисляет стандартное отклонение по измерениям, указанным в |
Функции представления и выбора
Мы включили ряд функций представления и выбора; интуитивно эти операторы будут применяться как к данным, так и к маске, а результат будет заключён в MaskedTensor. Для быстрого примера рассмотрим select():
>>> data = torch.arange(12, dtype=torch.float).reshape(3, 4)
>>> data
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]])
>>> mask = torch.tensor([[True, False, False, True], [False, True, False, False], [True, True, True, True]])
>>> mt = masked_tensor(data, mask)
>>> data.select(0, 1)
tensor([4., 5., 6., 7.])
>>> mask.select(0, 1)
tensor([False, True, False, False])
>>> mt.select(0, 1)
MaskedTensor(
[ --, 5.0000, --, --]
)
В настоящее время поддерживаются следующие операции:
atleast_1d
| Возвращает одномерный вид каждого входного тензора с нулевыми измерениями. |
broadcast_tensors
| Распространяет заданные тензоры в соответствии с семантикой распространения. |
broadcast_to
| Распространяет |
cat
| Конкатенирует заданную последовательность |
chunk
| Попытка разбить тензор на указанное количество кусков. |
column_stack
| Создает новый тензор, объединяя тензоры в |
dsplit
| Делит |
flatten
| Сглаживает |
hsplit
| Делит |
hstack
| Упаковывает тензоры последовательно по горизонтали (по столбцам). |
kron
| Вычисляет кронекеровское произведение, обозначенное как , тензоров |
meshgrid
| Создает сетки координат, задаваемые одномерными входами в тензорах |
narrow
| Возвращает новый тензор, который является суженным вариантом тензора |
ravel
| Возвращает сплошной, сглаженный тензор. |
select
| Вырезает фрагмент тензора |
split
| Разбивает тензор на части. |
t
| Ожидает |
transpose
| Возвращает тензор, являющийся транспонированной версией |
vsplit
| Делит |
vstack
| Упаковывает тензоры последовательно по вертикали (по строкам). |
Возвращает новый вид тензора | |
Расширяет этот тензор до размера, равного | |
Возвращает тензор с теми же данными и количеством элементов, что и | |
Возвращает этот тензор с формой, такой же как у | |
Возвращает новый тензор с теми же данными, что и тензор |
© 2024, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://pytorch.org/docs/2.1/masked.html