前情提要:用nibable读取nii格式数据,三个方向的网络输出loss总出现nan?
找原因:debug看到某几个病例的img就是nan,但用3D Slicer看数据没什么问题,大惊
结果分析:
origin_array = np.float32(sitk.GetArrayFromImage(
sitk.ReadImage(os.path.join(origin_path, i))))
##使用simpleitk读取的array里很小的数值为0,非-inf
np.array(nib.load('/data/histo_set/732_new_woADCset/153358_cm/153358 T2Sag 0.nii').get_fdata(), dtype="float32")
##而使用nibable读物的array里出现了很多的-inf
print(len(a[np.isnan(a)])) ##统计array里面为Nan的个数
print(len(a[~np.isnan(a)])) ##统计array里面非Nan的个数
###如何解决?用itk读取的array维度会变,不一致为128,128,64,所以最好还是用nibable读
data = np.nan_to_num(a,neginf=0) ##用0值代替-inf
## 下面是验证是否满足以上的推断
b=data.transpose(2,1,0) ##为nibable读取的array(128,128,64)
origin_array ##为itk读取的array(64,128,128)
##若两个矩阵完全相同,则验证成功
经验证,将nib读取的-inf转为0后,和itk读取的矩阵转置后相同,即验证成功
反思:没想到读取数据居然也暗藏玄机,调试花费了大量时间,谨以此贴,铭记在心!