«Runtimeerror: значение bool тензора с более чем одним значением неоднозначно» fastai - PullRequest
1 голос
/ 01 октября 2019

Я делаю семантическую сегментацию, используя набор данных cityscapes в fastai. Я хочу игнорировать некоторые классы при расчете точности. Вот как я определил точность в соответствии с курсом глубокого обучения fastai:

name2id = {v:k for k,v in enumerate(classes)}
unlabeled = name2id['unlabeled']
ego_v = name2id['ego vehicle']
rectification = name2id['rectification border']
roi = name2id['out of roi']
static = name2id['static']
dynamic = name2id['dynamic']
ground = name2id['ground']

def acc_cityscapes(input, target):
    target = target.squeeze(1)

    mask=(target!=unlabeled and target!= ego_v and target!= rectification
    and target!=roi and target !=static and target!=dynamic and 
    target!=ground)

return (input.argmax(dim=1)[mask]==target[mask]).float().mean()

Этот код работает, если я игнорирую только один из классов:

mask=target!=unlabeled

Но когда я пытаюсь игнорироватьнесколько классов, как это:

mask=(target!=unlabeled and target!= ego_v and target!= rectification
    and target!=roi and target !=static and target!=dynamic and 
    target!=ground)

Я получаю эту ошибку:

runtimeError: bool value of tensor with more than one value is ambiguous

Любая идея, как мне решить эту проблему?

1 Ответ

2 голосов
/ 01 октября 2019

Возможно, проблема в том, что ваш тензор содержит более 1 значений bool, что приведет к ошибке при выполнении логической операции (и, или). Например,

>>> import torch
>>> a = torch.zeros(2)
>>> b = torch.ones(2)
>>> a == b
tensor([False, False])
>>> a == 0
tensor([True, True])
>>> a == 0 and True
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: bool value of Tensor with more than one value is ambiguous
>>> if a == b:
...     print (a)
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: bool value of Tensor with more than one value is ambiguous

Потенциальным решением может быть использование логического оператора напрямую.

>>> (a != b) & (a == b)
tensor([False, False])

>>> mask = (a != b) & (a == b)
>>> c = torch.rand(2)
>>> c[mask]
tensor([])

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...