torch.masked
Создано: 15 авг. 2022 г. | Последнее обновление: 13 апр. 2026 г.
Введение
Мотивация
Предупреждение
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
| Возвращает новый тензор с десятичными логарифмами элементов |
log1p
| Возвращает новый тензор с натуральными логарифмами выражения (1 + |
log2
| Возвращает новый тензор с логарифмами по основанию 2 элементов |
logit
| Псевдоним для |
i0
| Псевдоним для |
isnan
| Возвращает новый тензор с логическими значениями, указывающими, является ли каждый элемент |
nan_to_num
| Заменяет значения |
neg
| Возвращает новый тензор с отрицательными значениями элементов |
negative
| Псевдоним для |
positive
| Возвращает |
pow
| Возводит каждый элемент |
rad2deg
| Возвращает новый тензор, в котором каждый элемент |
reciprocal
| Возвращает новый тензор с величинами, обратными элементам |
round
| Округляет элементы |
rsqrt
| Возвращает новый тензор со значениями, обратными квадратным корням каждого элемента |
sigmoid
| Псевдоним для |
sign
| Возвращает новый тензор со знаками элементов |
sgn
| Эта функция расширяет torch.sign() для комплексных тензоров. |
signbit
| Проверяет, установлен ли знаковый бит каждого элемента |
sin
| Возвращает новый тензор с синусами элементов |
sinc
| Псевдоним для |
sinh
| Возвращает новый тензор с гиперболическими синусами элементов |
sqrt
| Возвращает новый тензор с квадратными корнями элементов |
square
| Возвращает новый тензор с квадратами элементов |
tan
| Возвращает новый тензор с тангенсами элементов |
tanh
| Возвращает новый тензор с гиперболическими тангенсами элементов |
trunc
| Возвращает новый тензор с целыми частями элементов |
Доступны все перечисленные выше унарные операторы с изменением на месте, кроме:
Бинарные операторы
Как вы могли видеть в руководстве, MaskedTensor также реализует бинарные операции с оговоркой: маски двух MaskedTensor должны совпадать, иначе будет вызвана ошибка. Как отмечено в сообщении об ошибке, если вам нужна поддержка определённого оператора или вы предлагаете семантику его поведения, создайте issue на 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
| Логарифм суммы экспонент входных данных по основанию 2. |
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
| Псевдоним для |
Доступны все перечисленные выше операторы с изменением на месте, кроме:
logaddexp
| Логарифм суммы экспонент входных данных. |
logaddexp2
| Логарифм суммы экспонент входных данных по основанию 2. |
equal
|
|
fmin
| Поэлементно вычисляет минимум |
minimum
| Поэлементно вычисляет минимум |
fmax
| Поэлементно вычисляет максимум |
Операции редукции
Доступны следующие операции редукции (с поддержкой autograd). Дополнительную информацию и примеры операций редукции можно найти в руководстве Обзор, а в руководстве Расширенная семантика подробнее обсуждается, как были выбраны семантические правила для некоторых операций редукции.
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
| Разбивает тензор на части. |
stack
| Объединяет последовательность тензоров вдоль нового измерения. |
t
| Ожидает, что |
transpose
| Возвращает тензор, представляющий собой транспонированную версию |
vsplit
| Разбивает |
vstack
| Объединяет тензоры последовательности по вертикали (по строкам). |
Возвращает новое представление тензора | |
Расширяет этот тензор до размера | |
Возвращает тензор с теми же данными и количеством элементов, что и | |
Возвращает этот тензор с той же формой, что и | |
Возвращает представление исходного тензора, содержащее все срезы размера | |
Возвращает новый тензор с теми же данными, что и тензор |
torch.masked.maskedtensor.core
is_masked_tensor
| Возвращает True, если входные данные являются MaskedTensor, иначе False |
© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/masked.html