pytorch深度学习bug集合

1、出现下面错误说明网络中有多个线程,线程间出现问题

解决办法,在main入口处代码第一行 加入以下代码:

if __name__=='__main__':
    torch.multiprocessing.set_start_method('spawn') # 在main第一行加入这行代码即可
   .....

再次出现以下错误:

说明有些数据在cpu上,而有些在gpu上 ,发现有一个变量经过torch.Tensor变换后,没有转移到cuda上,所以加上to(device),代码运行成功!!

rank_score_norm = torch.Tensor(rank_score_norm).to(device)

2、梯度出现问题,在优化器梯度回传时候,出现以下错误,就是

 即在代码第17行:param.grad.data.即param.grad=None

pytorch深度学习bug集合_第1张图片

 那么我们就打印参数,看看哪些参数梯度为None:

在loss.backward()之后加入以下代码,打印参数名称以及对应的grad,并且将grad is None的参数名称打印出来:

  for name, param in model.named_parameters():
    print(name, '      ', param.grad)
    if param.grad is None :
      print(name,'      ',param.grad)

果不其然,打印出一堆None:

pytorch深度学习bug集合_第2张图片

 然后去找relationmatch对应部分的参数的问题,其实都是rel_matching这个模块对应的lang_text_fc层出现了问题,就是定义了fc层,也进行了前向传播,但是最后因为疏忽没有使用这个网络层!

3、加载model_pth时候出现以下问题,原因是模型原来在cuda3上(在服务器A上训练的),但是现在的服务器上(服务器B)只有2个cuda,因此运行代码提示:用map_location将cuda映射到当前的显卡上面

 更改如下:

device=torch.device('cuda',gpu_id)
#predictor.load_state_dict(torch.load(model_path))错误代码
predictor.load_state_dict(torch.load(model_path,map_location=device))#正确

4、在pytorch里面计算两个变量的加法时候,出现以下错误,说明两个变量类型不统一

 去debug,发现一个是float32 一个是64

print("dtype1%s"%(rpn_score1.dtype))  
# rpn_score1 is numpy ndarray的类型, .dtype看其数据类型,打印出来是float64
print("dtype2%s"%(rpn_score2.dtype))  
# rpn_score2 is torch.Tensor   .dtype看其数据类型,打印出来是float32

将float64转为float32,再转为cuda(Tensor)

rpn_score1=torch.from_numpy(rpn_score1.astype(np.float32)).to(device)

你可能感兴趣的:(python,代码,bug,pytorch,深度学习,人工智能)