PyTorch模型,pytorch model.train

  PyTorch模型,pytorch model.train

  最近被pytorch的模型转载,心态上来了一波。每次训练结果都不一样。一开始我以为我的网络优化是有效的,但是每次训练结果都不是固定的。经过长时间的调整,这个模型终于修好了。这里,记录这个坑。

  为pytorch1.7.1设置随机种子,使网络的训练结果每次都是固定的。这样就方便检查是否是网络修改或者随机性造成的精度提升。

  DEF _ SEED (SEED): #下面设置两个通用设置,用np和random设置NP。random . seed(seed)random . seed(seed)OS . environ[ python hasseed ]=str(seed)#禁止哈希随机化OS . environ[ cublas _ workspace _ config ]=:4096:8 #在cuda 10.2及以上版本中,需要设置以下环境变量以确保cuda结果可以重现torch . cuda . manual _ seed(seed)torch . cuda . manual _ seed _ all(seed)# This torch . manual _ seed(seed)需要设置为多torch . use _ deterministic _ algorithms(true)#有些操作使用原子操作,原子操作不是确定性算法,不能保证可重现性。设置此项以禁用原子操作,使用确定性算法torch。backends . cud nn . deterministic=true #确保每次返回的卷积算法是确定性torch。backends.cudnn.enabled=false #禁用cudnn以使用非确定性算法torch。backends . cud nn . benchmark=false #将与上述代码一起使用。如果是真的,它会自动找到最适合当前配置的高效算法,从而优化运行效率。false实验结果可以重现。除了cuda和cudnn的随机性,如果使用Dataloder也要注意设置。请参考https://pytorch.org/docs/stable/notes/randomness.html,官方网站。

  def worker _ init _ fn(worked _ id):worker _ seed=torch . initial _ seed()% 2 * * 32 NP . random . seed(worker _ seed)random . seed(worker _ seed)数据。数据加载器(dataset=XXX,batch _ size=XXX,shuffle=XXX,#关键是下面两个,分别设置worker _ init _ fn=worker _ init _ fn,num _ workers=0,)。以上操作应该只固定在同一个设备上,除非两个设备安装的所有环境都一样,两个设备的结果也可能一样。

  如果同样的设备经过上述操作后还不能修复,这是一个值得思考的问题。看nn的辍学参数。LSTM准备好了。听说这个用随机种子都修不好。有时间就去试试。

PyTorch模型,pytorch model.train