渭南华阴建设银行的网站是多少,网站建设的运作原理,网站制作与维护费用,开网站需要租用机房服务器价格修改自#xff1a;https://zhuanlan.zhihu.com/p/532511514我在刚接触pytorch的时候搜到了这个大佬的文章#xff0c;当时最后天坑部分没有看的太明白#xff0c;直到今天我也遇到的相同的问题#xff0c;特来做一点点补充#xff0c;方便大家理解。上述大佬文章的简版内容…修改自https://zhuanlan.zhihu.com/p/532511514我在刚接触pytorch的时候搜到了这个大佬的文章当时最后天坑部分没有看的太明白直到今天我也遇到的相同的问题特来做一点点补充方便大家理解。上述大佬文章的简版内容入门版本Pytorch复现的入门版本就是官方指南需要设定好各种随机种子。https://pytorch.org/docs/stable/notes/randomness.htmlimport random
import numpy as np
import torchrandom.seed(0) # Python 随机种子
np.random.seed(0) # Numpy 随机种子
torch.manual_seed(0) # Pytorch 随机种子
torch.cuda.manual_seed(0) # CUDA 随机种子
torch.cuda.manual_seed_all(0) # CUDA 随机种子2. Dataloader的并行DataLoader启用多线程时(并行的线程数num_workers 大于1)也会出现随机现象解决办法1. 禁用多线程num_workers 设置为0。2. 固定好worker的初始化方式代码如下def seed_worker(worker_id):worker_seed torch.initial_seed() % 2 ** 32numpy.random.seed(worker_seed)random.seed(worker_seed)g torch.Generator()g.manual_seed(0)DataLoader(train_dataset,batch_sizebatch_size,num_workersnum_workers,worker_init_fnseed_worker,generatorg,)3算法的随机性有些并行算法带有随机性比如LSTM或者注意力机制RNN等。尤其是使用 CUDA Toolkit 10.2 或更高版本构建 cuDNN 库时cuBLAS 库中新的缓冲区管理和启发式算法会带来随机性。在默认配置中使用两种缓冲区大小16 KB 和 4 MB时会发生这种情况。解决办法就是在代码头部设置环境变量:os.environ[CUBLAS_WORKSPACE_CONFIG] :4096:8如果是用到CNN的算法同时要设置以下变量torch.backends.cudnn.benchmark False # 限制cuDNN算法选择的不确定性
torch.backends.cudnn.deterministicTrue # 固定cuDNN算法设置完这些基本99%的情况下都可以复现结果如果无法复现那就重启notebook 或者python。天坑for 循环内随机性如果在一个for 循环内多次运行pytorch训练就会出现随机性。以下常见方式均无效强制每次train之前empty_cache每次循环结束后手动del 变量并且用gc 回收强制初始化模型的参数强制设置set_rng_statehttps://discuss.pytorch.org/t/manual-seed-cannot-make-dropout-deterministic-on-cuda-for-pytorch-1-0-preview-version/27281/8)重启python文件和notebook知乎大佬的解决方案上面的随机种子设置最好在for 循环里面设置否则可能白瞎。nn模型里面的dropout 在for 循环里面有随机性。解决办法是禁掉dropout或者显式的调用Dropout。对于该天坑本文作者的实验结果调用一次Dataloader就会影响下一个Dataloader的随机数生成。解释例如现在有两种模型的训练方式在train后面继续进行下一个Epoch的train。train后面进行val再进行下一个Epoch的train。这两种方式得到的训练结果从第二个Epoch开始就是不同的且val前后模型的weights没变那应该就是生成的随机数变了。因此应该就是调用一次Dataloader就会有新的随机数。总结以上就是Pytorch代码的复现终极指南保险起见的话先把能加的都加上然后看能否复现。之后如果有强迫症的话可以做减法逐个筛检直到保留必要的代码。愿天下太平代码无坑