STANet代码复现出现的问题

1

IndexError: boolean index did not match indexed array along dimension 0; dimension is 4194304 but corresponding boolean dimension is 65536

定位到导致错误的代码,是metric.py,Collect values for Confusion Matrix 收集混淆矩阵的值时出错
在这里插入图片描述
这一段是为了比较真实值与预测值,但是预测值的维度却比真实值大了64倍。
参考here
问题分析:
简要说就是torch版本更新后,有些函数输出的BCWH变成了BWHC。
运行报错后,一行一行溯源,发现问题出在pred的shape和Label的shape不匹配。
CDF0和CDFA中,forward是对backbone的计算的特征图进行相似度计算,然后这个相似度通过阈值1选择后作为pred的结果的。
以下为猜测,没有找到实料。我猜测老版本torch中F.pairwise_distance生成的结果是BCWH,因此可以直接拿来插值然后和label做比较。但新版本应该是变成了BWHC。用默认的Resnet18(即netF)生成的特征层应该为B*64©64(W)64(H),F.pairwise_distance生成的结果为B64(W)64(H)1©,插值后就变为B64256256,所以导致报错的dimension前面数值总是后面的64倍。
解决办法:
在CDFA和CDF0中,找到forward函数,将F.pairwise_distance生成的结果进行通道和行列变换。

    def forward(self):
        """Run forward pass; called by both functions <optimize_parameters> and <test>."""
        self.feat_A = self.netF(self.A)  # f(A)
        self.feat_B = self.netF(self.B)   # f(B)
        # 距离度量
        self.dist = F.pairwise_distance(self.feat_A, self.feat_B, keepdim=True) # 特征距离 B*W*H*C
        # 在此添加两个打印,可以输出看一下
       # print(self.dist.shape)# torch.Size([2, 64, 64, 1])
        # 在此新增以下代码行
        self.dist = self.dist.permute(0, 3, 1, 2)  # 需要变换成B*C*W*H
       # print(self.dist.shape)# torch.Size([2, 1, 64, 64])
        
        # print(self.dist.shape)
        self.dist = F.interpolate(self.dist, size=self.A.shape[2:], mode='bilinear',align_corners=True)

        #
        self.pred_L = (self.dist > 1).float()
        self.pred_L_show = self.pred_L.long() #将数字或字符串转换为一个长整型
        return self.pred_L

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weightOneMillion

感谢看官们的供粮~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值