torch 踩坑记录(一) 您所在的位置:网站首页 踩坑记录 torch 踩坑记录(一)

torch 踩坑记录(一)

2023-03-11 09:07| 来源: 网络整理| 查看: 265

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 实验室设备网 版权所有