Bobholamovic / CDLab

Yet another repository for developing and benchmarking deep learning-based change detection methods.
The Unlicense
196 stars 30 forks source link

问题请教 #13

Open MLS2021 opened 1 year ago

MLS2021 commented 1 year ago

您好,作为变化检测的初学者,在阅读和运行了您的代码之后,有个问题需要向您请教: 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,我该怎么编写损失函数。

Bobholamovic commented 1 year ago

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

MLS2021 commented 1 year ago

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
Bobholamovic commented 1 year ago

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

MLS2021 commented 1 year ago

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

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

Bobholamovic commented 1 year ago

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

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

主要损失1.0,辅助损失0.4

MLS2021 commented 1 year ago

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

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

主要损失1.0,辅助损失0.4

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