#deep-learning #computer-vision #pytorch #image-segmentation #loss-function
Вопрос:
Я использую согласованность между двумя прогнозируемыми картами сегментации для немаркированных данных. Для помеченных данных я использую nn.BCEwithLogitsLoss и проигрыш в кости.
Я работаю над видео, поэтому выводится 5 измерений. (размер пакета, каналы, кадры, высота, ширина)
Я хочу знать, как мы можем сравнить две предсказанные карты сегментации.
gmentation maps.
# gt_seg - Ground truth segmentation map. - (8, 1, 8, 112, 112)
# aug_gt_seg - Augmented ground truth segmentation map - (8, 1, 8, 112, 112)
predicted_seg_1 = model(data, targets) # (8, 1, 8, 112, 112)
predicted_seg_2 = model(augmented_data, augmented_targets) #(8, 1, 8, 112, 112)
# define criterion
seg_criterion_1 = nn.BCEwithLogitsLoss(size_average=True)
seg_criterion_2 = nn.DiceLoss()
# labeled losses
supervised_loss_1 = seg_criterion_1(predicted_seg_1, gt_seg)
supervised_loss_2 = seg_criterion_2(predicted_seg_1, gt_seg)
# Consistency loss
if consistency_loss == "l2":
consistency_criterion = nn.MSELoss()
cons_loss = consistency_criterion(predicted_gt_seg_1, predicted_gt_seg_2)
elif consistency_loss == "l1":
consistency_criterion = nn.L1Loss()
cons_loss = consistency_criterion(predicted_gt_seg_1, predicted_gt_seg_2)
total_supervised_loss = supervised_loss_1 supervised_loss_2
total_consistency_loss = cons_loss
Является ли это правильным способом применения согласованности между двумя прогнозируемыми картами сегментации?
Я в основном запутался из-за определения на веб-сайте torch. Это сравнение входного x с целевым y. Я подумал, что это выглядит правильно, так как я хочу, чтобы обе предсказанные карты сегментации были похожи. Но 2-я карта сегментации не является целью. Вот почему я в замешательстве. Потому что, если бы это было допустимо, то каждая функция потерь могла бы быть применена тем или иным способом. Мне это не кажется привлекательным. Если это правильный способ сравнения, можно ли распространить его на другие потери, основанные на сегментации, такие как потеря костей, потеря долгового обязательства и т.д.?
Еще один запрос, касающийся расчета потерь на помеченных данных:
# gt_seg - Ground truth segmentation map
# aug_gt_seg - Augmented ground truth segmentation map
predicted_seg_1 = model(data, targets)
predicted_seg_2 = model(augmented_data, augmented_targets)
# define criterion
seg_criterion_1 = nn.BCEwithLogitsLoss(size_average=True)
seg_criterion_2 = nn.DiceLoss()
# labeled losses
supervised_loss_1 = seg_criterion_1(predicted_seg_1, gt_seg)
supervised_loss_2 = seg_criterion_2(predicted_seg_1, gt_seg)
# augmented labeled losses
aug_supervised_loss_1 = seg_criterion_1(predicted_seg_2, aug_gt_seg)
aug_supervised_loss_2 = seg_criterion_2(predicted_seg_2, aug_gt_seg)
total_supervised_loss = supervised_loss_1 supervised_loss_2 aug_supervised_loss_1 aug_supervised_loss_2
Правильно ли вычисление total_supervised_loss? Могу ли я применить loss.backward() к этому?
Комментарии:
1. Да, вы можете применить
loss.backward()
функцию потерь, состоящую из нескольких составляющих потерь, даже при нескольких проходах вперед (в этом случае вы выполняете 2 прохода вперед на каждый 1 проход назад). Не думайте, однако, что хранение графика вычислений для сложной сети потребляет довольно много памяти для каждого прямого прохода.2. Не могли бы вы подробнее рассказать о последнем предложении, связанном с проблемой памяти? Любые предложения, как я могу сделать его более эффективным с точки зрения памяти.
Ответ №1:
Да, это правильный способ реализовать потерю согласованности. Номенклатура, используемая в документации pytorch, перечисляет один вход в качестве цели, а другой в качестве прогноза, но учтите, что L1, L2, кости и потеря долгового обязательства все симметричны (то есть Loss(a,b)
= Loss(b,a)
). Таким образом, любая из этих функций приведет к потере согласованности, независимо от того, является ли один ввод на самом деле правдой или «целью».