关于神经网络是否可以复现,之前一直也很感兴趣。在群里问过一个大佬后,大佬说是cudnn的一些操作导致结果无法完全复现。刚刚在zhihu上也看到相应问题,在这里做个记录,之后有空希望能做个实验。
1) 数据方面
- 数据的预处理方式可能不一样.数据增强方式可能不一样, 且数据增强具有一定的随机性.
- 数据的训练顺序, 采样方式可能不一样.
2) 模型方面 - 模型参数的初始化方式和初始值可能不一样.
- 模型中一些操作具有一定的随机性 (如 dropout 等).
3) 训练方面训练采用的优化器 (optimizer) 可能不一样. - 与训练相关的一些超参或设置 (如 batch size, learning rate scheduler 等) 可能不一样.
- 如果采用不同的训练框架方式训练, 框架在实现上的差异也会导致结果存在差异.
除开上述这些因素外,有人提出了这种方案来达成结果复现
第一步,设置一样的seed
np.random.seed(cfg.RNG_SEED)
torch.manual_seed(cfg.RNG_SEED)
torch.cuda.manual_seed_all(cfg.RNG_SEED)
random.seed(cfg.RNG_SEED)
第二步,关闭cudnn,打开determinstic,假如你依旧想获得cudnn加速效果,可以这么整:
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.enabled = True
除此之外,浮点数运算的舍入舍出也存在数据精度的丢失,
要完全复现结果,我想到了几个方向:
- 网络初始化要一致
- 我们训练得到的梯度大小和方向也必须一致
- 各种随机操作的随机种子必须一致
- 每次读进来的数据要一致
- 学习率要一致
参考资料
aurogra 100 online https://aurogra.buszcentrum.com/
dapoxetine generic drug https://ddapoxetine.com/
how to take dapoxetine citrate https://dapoxetine.bee-rich.com/
nolvadex tablets https://tamoxifen.mrdgeography.com/
generic viagra 150 mg http://droga5.net/
walmart tadalafil vidalista 20mg https://vidalista.mlsmalta.com/
ivermectin pills cvs https://ivermectin.webbfenix.com/
mint hydroxychloroquine side effects https://hydroxychloroquine.mlsmalta.com/
remdesivir versus hydroxychloroquine https://hydroxychloroquine.webbfenix.com/
ivermectin overdose in humans https://ivermectin.mlsmalta.com/
dapoxetine hydrochloride 60 https://salemeds24.wixsite.com/dapoxetine
careprost eyelash growth https://carepro1st.com/
viagra without viagra without a doctor prescription https://buszcentrum.com/
uses for acyclovir https://www.herpessymptomsinmen.org/productacyclovir/