torch 踩坑记录(一) | 您所在的位置:网站首页 › 踩坑记录 › torch 踩坑记录(一) |
AMD 的显卡问题
amd的老显卡,linux平台早不更新了,建议win平台下面用 torch_directml 搞定 pip install torch_directml import torch_directml device = torch_directml.device()剩下的内容和cuda一样了。 没有梯度的错误element 0 of tensors does not require grad and does not have a grad_fn 这个问题太恶心了,不过问题还是在于代码不规范,没有理解到torch的工作机制。错误出现在保存后,再load,结果就出错了。翻阅了很多地方,才知道是to(device)不能乱用,会把require_grad 这个参数给丢掉。仔细检查代码,发现,load 的时候,正确的代码应该是。 checkpoint = torch.load(model_path, map_location=device) model = MyNet(input_dim) model = model.to(device) model.load_state_dict(checkpoint['model_state_dict'])我之前错误的把 to(device) 写在了load_state_dict 后面,而且load的时候没有map_location。 optimizer没有load导致的bug这个问题也是在规范代码后才解决的,官方的documentation里面有示例,可以看链接,关键的是,optimizer也要load,epoch和step其实也建议存在这个checkpoint里面。 def save_checkpoint(models_path,model,optimizer,epoch_num=0,step=0,scheduler=False): r"""save state dict in models_path/model_num.pt""" checkpoint = { "model_state_dict": model.state_dict(), "optimizer_state_dict": optimizer.state_dict(), "epoch_num": epoch_num, "step": step } if scheduler: checkpoint['scheduler_state_dict'] = scheduler.state_dict() save_path = os.path.join(models_path,f'model_{epoch_num}.pt') torch.save(checkpoint, save_path) optimizer 的参数修改在optimizer load之后 # 一定要 load optimizer ,否则没法训练 if checkpoint['saved']: optimizer.load_state_dict(checkpoint['optimizer_state_dict']) # 进行以下的修正,才能真正修改params for params in optimizer.param_groups: params['lr'] = learning_rate params['momentum'] = momentum |
CopyRight 2018-2019 实验室设备网 版权所有 |