#deep-learning #computer-vision #pytorch #image-segmentation #semantic-segmentation
#глубокое обучение #компьютерное зрение #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]
Как я могу решить эту проблему?
Комментарии:
1. Пожалуйста, добавьте гиперссылку на модель U-Net
2. Какую форму ожидает модель?
assert
Непосредственно перед появлением этой ошибки может произойти сбой строки.3. @Abhi25t Привет, вот ссылка на модель, которую я использовал: github.com/milesial/Pytorch-UNet.git .
4. Ожидаемая форма выходного сигнала модели равна [2,5,128,128]. Я не смог найти соответствующий оператор assert
Ответ №1:
Кажется, вы используете либо nn.CrossEntropyLoss
или nn.functional.cross_entropy
Я тоже столкнулся с такой же ошибкой.
CrossEntropyLoss обычно используется для классификации вариантов использования.
Если вашими целями являются нормализованные тензоры со значениями в [0, 1]
, вы можете использовать nn.BCELoss
или nn.functional.binary_cross_entropy_with_logits
. Это сработало в моем случае, поскольку мы используем отдельную маску для каждого класса — это становится проблемой бинарной перекрестной энтропии.