Форма достоверной информации в мультиклассовой сегментации изображений с помощью pytorch

Я работаю над изображениями ячеек 128 x 128 x 3 и хочу разделить их на 5 классов, включая фоны. Сначала я сделал целевые изображения 128 x 128 и значениями в {0,1,2,3,4}. Но я обнаружил, что мне нужно сделать свою целевую наземную истину как 5-канальное изображение, и все значения равны 0 или 1: если пиксель имеет 1 в n-м канале, то он должен быть отнесен к n-му классу.

Но когда я запустил свою модель в модель Unet, которую я разветвил из GitHub, я обнаружил ошибку при вычислении кросс-энтропийной потери.

Изначально я установил количество каналов на входе равным 3, а количество классов на выходе равным 5. И размер пакета = 2.

Вот мои коды:

for i, (x, y) in batch_iter:
    input, target = x.to(self.device), y.to(self.device)  # send to device (GPU or CPU)
    self.optimizer.zero_grad()  # zerograd the parameters
    out = self.model(input)  # one forward pass
    loss = self.criterion(out, target)  # calculate loss
    loss_value = loss.item()
    train_losses.append(loss_value)
    loss.backward()  # one backward pass
    self.optimizer.step()  # update the parameters

    batch_iter.set_description(f'Training: (loss {loss_value:.4f})')  # update progressbar

self.training_loss.append(np.mean(train_losses))
self.learning_rate.append(self.optimizer.param_groups[0]['lr'])

batch_iter.close()

И сообщение об ошибке

RuntimeError: 1only batches of spatial targets supported (3D tensors) but got targets of size: : [2, 5, 128, 128]

Как я могу это решить?


person goldrain1008    schedule 15.02.2021    source источник
comment
Пожалуйста, добавьте гиперссылку модели U-Net   -  person Abhi25t    schedule 15.02.2021
comment
Какая форма ожидается от модели? Непосредственно перед тем, как возникла эта ошибка, может произойти сбой строки assert.   -  person Abhi25t    schedule 15.02.2021
comment
@ Abhi25t Привет, вот ссылка на модель, которую я использовал: github.com/milesial/Pytorch- UNet.git.   -  person goldrain1008    schedule 16.02.2021
comment
Ожидаемый результат модели - [2,5,128,128]. Я не смог найти соответствующее утверждение   -  person goldrain1008    schedule 16.02.2021


Ответы (1)


Похоже, вы используете nn.CrossEntropyLoss или nn.functional.cross_entropy

Я тоже столкнулся с той же ошибкой.

CrossEntropyLoss обычно используется для целей классификации.

Если ваши цели являются нормализованными тензорами со значениями в [0, 1], вы можете использовать nn.BCELoss или nn.functional.binary_cross_entropy_with_logits. В моем случае это сработало, поскольку мы используем отдельную маску для каждого класса - это становится проблемой бинарной кросс-энтропии.

person Abhi25t    schedule 30.03.2021