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