Как лучше всего проверить, пуст ли torch :: Tensor?

В настоящее время я использую метод has_storage(), чтобы проверить, пуст ли тензор, но мне интересно, есть ли что-нибудь лучше, чем это! и есть ли какие-либо последствия, связанные с использованием этого, кроме того факта, что инициализированный torch::Tensor всегда имеет хранилище, а пустой - нет!


person Rika    schedule 19.08.2020    source источник


Ответы (2)


После некоторого покопания выясняется, что лучшим решением для этого является использование метода .numel(), который возвращает количество элементов, которые имеет тензор.
В итоге:

  • Чтобы узнать, выделен ли тензор (тип и хранилище), используйте defined ().
  • Чтобы узнать, имеет ли выделенный тензор нулевые элементы, используйте numel()
  • Чтобы узнать, выделен ли тензор и имеет ли он нулевые элементы, используйте defined(), а затем numel()

Боковое примечание:
Пустой тензор (например, созданный с помощью torch::Tensor t;) возвращает ноль при использовании .numel(). в то время как размер / размеры приведут к исключению.

Это идеальная проверка для таких случаев, когда возвращается пустой тензор (в том смысле, который я только что объяснил выше), можно просто сделать:

if (!tensor.numel())
{
    std::cout<<"tensor is empty!" << std::endl;
    // do other checks you wish to do
}

ref

person Rika    schedule 22.08.2020

Да, здесь есть небольшой нюанс: все тензоры не имеют одинаковой базовой реализации, и некоторые реализации будут иметь has_storage возврат false, несмотря ни на что. Это, в частности, относится к разреженному тензору (см. здесь).

Однако лучшего способа я не знаю. Просто убедитесь, что вы правильно отслеживаете свои разреженные тензоры, если вы их используете (и ваш непрозрачные тензоры, если они вам когда-нибудь понадобятся ^^)

person trialNerror    schedule 19.08.2020
comment
Еще раз большое спасибо. очень ценю ваше время и хорошо объясненные ответы - person Rika; 19.08.2020