赞
踩
在训练之前呢使用这个函数定义好随机种子就可以了。
def fix_random(seed=0):
def setup_seed(seed):
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.benchmark = False # 针对数据的分布自动实现寻找卷积效率最高的方式(如果是true)
torch.backends.cudnn.deterministic = True # 实现卷积的方式是巩固定的
setup_seed(seed)
YOLOv5本身会有自己的随机种子。通过下列方法使用:
python train.py --seed 2
但是他有一个问题,YOLOv5代码中的随机种子虽然固定了,但是仍然有问题,将
utils/general.py中的init_seeds的代码进行修改:
def init_seeds(seed=0, deterministic=False):
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.benchmark = False
torch.use_deterministic_algorithms(True)
if deterministic and check_version(torch.__version__, '1.12.0'):
torch.backends.cudnn.deterministic = True
os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8'
os.environ['PYTHONHASHSEED'] = str(seed)
对比一下就会发现,实际上就两个参数影响到了无法稳定复现,那就是:
torch.backends.cudnn.benchmark和torch.use_deterministic_algorithms
修改好就可以解决问题了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。