最近在用pytorch写FCN时,将损失函数换成了CrossEntropyLoss,出现的问题是在第一个反向传播后,loss一下变成了0,之后再怎么训练loss都是0不再变化。而最初的loss看起来是一个正常的浮点数,很显然网络不可能经过一个epoch就找到了最优解。
经过仔细排查后,发现经过dataloader出来的标签里面的值都为0,正常应该会包含一些[0,calss_num)的整数标签,原来是读取的mask文件经过transforms.ToTensor()方法之后都变成了0,该方法的源码中也写到
because the input image is scaled to [0.0, 1.0], this transformation should not be used when transforming target image masks.
也就是说文件中的所有值在totensor之后最后映射在[0,1]这个区间,而我还转成了long类型(为了匹配loss函数的要求),所以最后都变成了0。
因此解决方法为使用torch.as_tensor(img)方法将读取的mask_img转成tensor,再使用torch.unsqueeze(img,0)提升一个维度,这样就能无缝替换上面ToTensor了。
FCN图像分割的mask标签使用transforms.ToTensor问题
最新推荐文章于 2023-04-12 18:42:03 发布