赞
踩
args = parser.parse_args() #(代码中需要的一些参数)
set_seed(args.seed)
def set_seed(seed):
random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.enabled = True
(1)在设置完第一步中的随机种子后,基本上可实现结果的可复现性。我的算法中用到了bert模型,但设置完随机种子后每次的实验结果仍然会不一样。
(2)后来通过检查发现,bert的输入input_ids每次不一样,因此得到的输出表征会不同,自然最终的实验结果也会不同。
(3)原因在于:我在将类别的token拼接文本token做为bert模型的输入时,涉及到使用set()的方式来过滤掉类别token中的重复元素。由于set()是一种无序的不重复元素序列,因此每次在gpu运行代码时,过滤后的类别token中元素的顺序都会随机改变(但在cpu上没有改变~不知为啥),所以input_ids会不同。
(4)解决方法:在生成bert的输入时,避免使用set()。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。