WAMAWAMA / TNSCUI2020-Seg-Rank1st

This is the source code of the 1st place solution for segmentation task in MICCAI 2020 TN-SCUI challenge.
481 stars 78 forks source link

关于实验可重复性的提问 #18

Closed sjjdd closed 3 years ago

sjjdd commented 3 years ago

您好,在您的项目中应该没有考虑实验可重复性的问题吧,就是即使是相同的代码和数据集,每次重新运行,最后结果都会稍有不同吧。我尝试使实验可重复,因为想公平比较模型的性能,如果本身就有随机性的话,就无法确定是代码本身随机性导致最后结果不同,还是模型的改进了。我在step2_TrainAndValidate.py(主要训练模型的那个文件中)开头添加了如下代码: image 但是发现训练过程中,每一个epoch指标还是不一样,请问您有什么关于保证实验可重复性的经验吗,想请教,多谢

WAMAWAMA commented 3 years ago

是的,我们代码可重复性并没有考虑很周全,抱歉抱歉,因为是比赛代码,所以当时写完tch report就没有补充完善实验了。 1)你设置的随机数种子思路没错,结果不一样的原因可能是还有额外的随机数种子没有被设置,这个我近快尝试一下; 2)我觉得公平比较模型性能,可以设置多个随机数种子多次实验,这样才比较公平; 3)对于甲状腺分割问题,基于交叉验证的不同分折情况导致性能波动会比较大(其余和随机数种子相关其实几乎不会对分割这种密集预测任务的结果有影响,个人经验),所以要么分折数多一些(10折20折),要么多跑重复实验,最终保证结果稳定

sjjdd commented 3 years ago

谢谢您,嗯嗯我想的是不用交叉验证,因为只是想比较一下各个模型的性能,只是用相同的训练集,验证集,测试集,相同的训练策略来比较不同的模型的性能,我想请教一下向那种研究的论文里他们比较模型的性能的话,是保证了模型可重复性吗,应该不是一个模型只运行一遍取那个测试集上的结果作为最终结果的吧?

WAMAWAMA commented 3 years ago

肯定是要保证重复性,科学就是要可重复嘛😀 至于实验是否严格,那就看作者学术道德了😝

sjjdd commented 3 years ago

好的,感谢您的回复,若您有空,您的可重复性实验代码到时会上传到github吗,请问。这个可重复性是能保证运行过程中每个epoch下的loss,acc啥的指标都一样吗,我在您的工程添加了上述随机数种子代码后发现,每个batch下的图片以及变化都是一样的,但是观察前3个epoch的指标居然还是不一样,而且学习率都已经改成了线性的0.0001.如下两张图,同样的代码先后跑的结果。 image

image

WAMAWAMA commented 3 years ago

1)会的 2)“这个可重复性是能保证运行过程中每个epoch下的loss,acc啥的指标都一样吗” 是的,可重复性就是要任何数值都要一致 ps,测试集指标不同的原因,可能是因为这一行代码导致的link 也就是每次drop_last的那个last不一样 试着取消这个看一下? 3)cudnn.benchmark = True也可能导致重复性问题,也可以改为False试一下

sjjdd commented 3 years ago

感谢您的回复,我已经尝试了好久,现在已经取消了训练集和测试集中的drop_last,也就是按照默认的False,不丢弃,也去掉了step2_TrainAndValidate.py 的main函数中cudnn,benchamark = True.且在step2_TrainAndValidate.py 开头调用了seed_torch(0),如下图所示,

image image seed_torch中设置了随机数种子,参考网上的设置写的。甚至去掉了所有数据增强,只保留了resize()和ToTensor(),且num_workers=0,学习率不变线性的0.0001.模型用的是普通的unet.使用数据集就是TNSCUI的数据集,我是本地划分了训练集,验证集,测试集, image

不准备采用交叉验证的方式。不知道您工程中是不是还有其他细节我没有注意到,我感觉loss的计算,指标的计算这些也没有错也不会影响结果呀。先后跑了两次结果如下:按照您的代码指标都是保留4位小数的,从一开始每个epoch训练集上的loss就不一样,验证集上自然不用说了也不一样。

image image

我查看了result目录下的两次实验的images目录保存的图片,如Train_0_image.png,应当是最后一次epoch的第一个batch送进网络的图片吧,我的batch_szie是8,两次看着是一样的啊,这就有点迷了,前后运行两次代码又没改,这样网络输出结果还是不一样,计算出来的指标啥的还是不一样。 image image 期待您的解决和指导,再次感谢您的耐心回复和帮助。

sjjdd commented 3 years ago

你好,关于这个不可重复性实验,貌似是pytorch框架的原因,nn.upsample中关于使用bilinear本身就会导致不可重复性。

WAMAWAMA commented 3 years ago

我在其他代码测试了随机数种子,确实是可重复的,也用到了nn.upsample的bilinear image image 还是建议切换torch版本