В настоящее время я использую метод has_storage()
, чтобы проверить, пуст ли тензор, но мне интересно, есть ли что-нибудь лучше, чем это! и есть ли какие-либо последствия, связанные с использованием этого, кроме того факта, что инициализированный torch::Tensor
всегда имеет хранилище, а пустой - нет!
Как лучше всего проверить, пуст ли torch :: Tensor?
Ответы (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
}
Да, здесь есть небольшой нюанс: все тензоры не имеют одинаковой базовой реализации, и некоторые реализации будут иметь has_storage
возврат false
, несмотря ни на что. Это, в частности, относится к разреженному тензору (см. здесь).
Однако лучшего способа я не знаю. Просто убедитесь, что вы правильно отслеживаете свои разреженные тензоры, если вы их используете (и ваш непрозрачные тензоры, если они вам когда-нибудь понадобятся ^^)