Pytorch因nn.Parameter导致实验不可复现的一种情况

没解决,只是记录这种情况。

也可以多次实验取均值以避免结果复现。

场景

  • 自己的模块中,包含一个与x相加的可学习参数,导致单卡同种子下结果无法复现。
    • 去掉该模块,能正常复现。
    • 保留声明,注释使用后,能正常复现。且结果与无该模块的结果一致。
  • 除了在训练前设定种子外,我还在模块内部再次设置了种子,但依然无效。

相关代码

def __init__(self):
    self.pos = torch.nn.Parameter(torch.zeros((1, 1, config.DATA.HEIGHT, config.DATA.WIDTH)))

def set_seed(self):
    seed = 1
    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    torch.cuda.manual_seed(seed)
    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.benchmark = False

def forward(self, x):
    x += self.pos
    return x

吐槽

  • 在第一次增加后,性能增了1个点,我还以为我nb起来了。
    • 后来习惯性复现的时候,发现结果又变了。
    • 调试几天才发现是这个原因。
  • 考虑的性能变好,大不了我多次实验取均值。
    • 结果多次实验都掉了,再也回不去了。
    • 所以也没继续解决。
  • 值得一提的是,TransReID的代码中,就是这么用的,但是它的结果就能复现,咱们明明都设置种子了。下面是TransReID里用的。
self.pos_embed = nn.Parameter(torch.zeros(1, num_patches + 1, embed_dim))

版权声明:
作者:MWHLS
链接:https://panwj.top/4871.html
来源:无镣之涯
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
< <上一篇
下一篇>>
文章目录
关闭
目 录