torch.masked
Введение
Мотивация
Предупреждение
API PyTorch для тензоров с масками находится на стадии прототипа и может измениться в будущем.
MaskedTensor служит расширением для torch.Tensor, предоставляя пользователю возможность:
- использовать любые маскируемые семантики (например, тензоры переменной длины, операторы nan*, и т. д.)
- различать градиенты 0 и NaN
- различные применения разреженности (см. учебник ниже)
«Указанные» и «неуказанные» значения имеют давнюю историю в PyTorch без формальной семантики и, безусловно, без согласованности; на самом деле, MaskedTensor возник из-за накопившихся проблем, которые базовый класс torch.Tensor не мог должным образом решить. Таким образом, основная цель MaskedTensor — стать источником истины для указанных и неуказанных значений в PyTorch, где они являются полноценными объектами, а не послемыслями. В свою очередь, это должно дополнительно раскрыть потенциал разреженности, обеспечить более безопасные и согласованные операторы и предоставить более плавный и интуитивно понятный опыт для пользователей и разработчиков.
Что такое MaskedTensor?
MaskedTensor — это подкласс тензора, состоящий из 1) входных данных (данные) и 2) маски. Маска указывает, какие элементы из входных данных должны быть включены или проигнорированы.
Например, предположим, что мы хотим замаскировать все значения, равные 0 (представленные серым цветом) и взять максимальное значение:
Вверху показан пример обычного тензора, а внизу — MaskedTensor, где все нули замаскированы. Это явно дает разные результаты в зависимости от наличия маски, но эта гибкая структура позволяет пользователю систематически игнорировать любые элементы во время вычислений.
Уже есть ряд учебников, которые мы написали, чтобы помочь пользователям освоиться, например:
- Обзор — точка старта для новых пользователей, обсуждаются способы использования MaskedTensors и причины их полезности
- Разреженность — MaskedTensor поддерживает разреженные данные COO и CSR и тензоры масок
- Разреженные семантики Adagrad — практический пример того, как MaskedTensor может упростить разреженные семантики и реализации
- Расширенные семантики — обсуждение причин принятия определенных решений (например, необходимость соответствия масок для бинарных/сводных операций), различий с MaskedArray NumPy и семантики сводных операций
Поддерживаемые операторы
Унарные операторы
Унарные операторы — это операторы, содержащие только один вход. Их применение к MaskedTensors относительно просто: если данные замаскированы в данном индексе, мы применяем оператор, иначе мы продолжим маскирование данных.
Доступные унарные операторы:
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
| Возвращает новый тензор с булевыми элементами, указывающими, является ли каждый элемент |
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
| Возвращает новый тензор с усечёнными целыми значениями элементов |
Доступные унарные операции на месте: все вышеперечисленные, кроме:
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
| Логарифм суммы экспонент входных данных в базе-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
| Псевдоним для |
Доступные бинарные операторы inplace — все вышеперечисленные, кроме:
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
| Создает сетки координат, заданные входными 1D в |
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/1.13/masked.html