CDLab icon indicating copy to clipboard operation
CDLab copied to clipboard

问题请教

Open MLS2021 opened this issue 2 years ago • 6 comments

您好,作为变化检测的初学者,在阅读和运行了您的代码之后,有个问题需要向您请教: if return_aux: pred_v = self.conv_out_v(feats_v[-1]) pred_v = F.interpolate(pred_v, size=pred.shape[2:]) return pred, pred_v else: return pred 如果 return_aux = True ,返回的就是一个turple。我直接开始训练的话就会报错: if not (target.size() == input.size()): AttributeError: 'tuple' object has no attribute 'size' 这个错误出现在: loss = criterion(result, gt), 在计算损失函数的时候, 如果return_aux = False,则不会报错。 想请问一下,如果这个pred_v的作用是什么,如果我需要使用pred_v,我该怎么编写损失函数。

MLS2021 avatar Apr 17 '23 04:04 MLS2021

pred_v是Video分支的输出,算是一个网络的中间输出,训练的时候可以用来计算辅助损失。P2V默认应该就已经使用到了pred_v哦?请问你是否改动了代码呀

Bobholamovic avatar Apr 17 '23 06:04 Bobholamovic

pred_v是Video分支的输出,算是一个网络的中间输出,训练的时候可以用来计算辅助损失。P2V默认应该就已经使用到了pred_v哦?请问你是否改动了代码呀

我没有修改P2VNet的结构,由于我不清楚pred_v的作用,我就没有使用它。将这句代码: def forward(self, t1, t2, return_aux=False) 中的return_aux改为了False。 if return_aux: pred_v = self.conv_out_v(feats_v[-1]) pred_v = F.interpolate(pred_v, size=pred.shape[2:]) return pred, pred_v else: return pred 不过train函数我是用的自己的。您的意思是,如果需要使用pred_v则要调整损失函数。您看一下这个损失函数可以使用吗: class CombinedLoss_DS(nn.Module): def init(self, critn_main, critn_aux, coeff_main=1.0, coeffs_aux=1.0, main_idx=0): super().init() self.critn_main = critn_main self.critn_aux = critn_aux self.coeff_main = coeff_main self.coeffs_aux = coeffs_aux self.main_idx = main_idx

def forward(self, preds, tar, tar_aux=None):
    if tar_aux is None:
        tar_aux = tar

    pred_main = preds[self.main_idx]
    preds_aux = [pred for i, pred in enumerate(preds) if i != self.main_idx]

    if isinstance(self.coeffs_aux, float):
        coeffs_aux = [self.coeffs_aux]*len(preds_aux)
    else:
        coeffs_aux = self.coeffs_aux
    if len(coeffs_aux) != len(preds_aux):
        raise ValueError

    loss = self.critn_main(pred_main, tar)
    for coeff, pred in zip(coeffs_aux, preds_aux):
        loss += coeff * self.critn_aux(pred, tar_aux)
    return loss

MLS2021 avatar Apr 17 '23 07:04 MLS2021

其实不一定要用到CombinedLoss_DSreturn_aux为True时模型会有两个输出,对他们分别都和标签计算损失,然后加权求和,就可以啦

Bobholamovic avatar Apr 17 '23 07:04 Bobholamovic

其实不一定要用到CombinedLoss_DSreturn_aux为True时模型会有两个输出,对他们分别都和标签计算损失,然后加权求和,就可以啦

哦哦,对哈。多谢提醒。加权的话,是55开吗。您当初训练时,权重是多少。

MLS2021 avatar Apr 17 '23 07:04 MLS2021

其实不一定要用到CombinedLoss_DSreturn_aux为True时模型会有两个输出,对他们分别都和标签计算损失,然后加权求和,就可以啦

哦哦,对哈。多谢提醒。加权的话,是55开吗。您当初训练时,权重是多少。

主要损失1.0,辅助损失0.4

Bobholamovic avatar Apr 17 '23 08:04 Bobholamovic

其实不一定要用到CombinedLoss_DSreturn_aux为True时模型会有两个输出,对他们分别都和标签计算损失,然后加权求和,就可以啦

哦哦,对哈。多谢提醒。加权的话,是55开吗。您当初训练时,权重是多少。

主要损失1.0,辅助损失0.4

好的,非常感谢您的指导。

MLS2021 avatar Apr 17 '23 08:04 MLS2021