PyTorch 常见问题整理

最近刚刚开始从 Keras 换成 PyTorch,在使用过程中可能会遇到一些常见的问题,做一些整理。

1 Loss 为 NaN

可以在 python 文件头部使用如下函数打开 nan 检查:

如果遇到了 nan 的 Tensor,它会抛出异常。幸运的话它会告诉你 nan 产生的位置。比如说我遇到过:

有些时候,往往会遇到比如 Adam 就没有 nan 而 SGD 就会出现 nan,这种通常都是 Loss 设得太大,可以调低学习率试试。

其他可能产生 nan 的地方可以尝试定位下:
1、脏数据,输入有 NaN
2、设置 clip gradient
3、更换初始化参数方法

2 正确测试模型运行时间

如果是为了测试模型的前向运算运行时间,需要设置 model 为评估模式:

同时在 GPU 上测速时需要使用 torch.cuda.synchronize() 同步 CUDA 操作:

3 参数初始化

在一些任务中,如果不是使用已有训练参数而是从 0 开始训练一个空白的网络,进行参数的初始化(例如 Conv2D)会有利于加快模型的收敛,例如下面参数初始化方式是(通常可以放在 model 的 init 函数结尾):

4 获取 torchvision 中某一层的输出

工程实践中经常用 torchvision 预训练参数然后提取其中部分层进行修改。这里面可以有两种方式:
第一种,直接 copy 全部的代码,然后根据自身需要输出中间层:
例如对于 shufflenetv2 代码可以这样修改返回你需要的层(_forward_impl 是原始的,_forward_impl_with_layers 是修改的):

另外一种方法不下载代码直接调用 torchvision 中的层,这个可能需要分析每个代码的实现才能知道想要的层,比如这样打印:

打印结果类似:

比如获得 conv1 层输出就是

5 修正 The NVIDIA driver on your system is too old 错误

有时在你安装某一个版本的 PyTorch (比如 1.5.0) 时会出现如下错误提示:

在安装 PyTorch 的时候往往会指定相应的 CUDA 版本,这个错误的意思可能是你没有安装特定版本的 CUDA 或者你的 CUDA 版本与你的 GPU Driver 版本不匹配。
在 Nvidia 官网中给了我们如下的版本匹配:https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html

如果需要升级,你可以使用如下方式升级:
1)增加软件源:

2)查看可以使用的版本:

例如我这里查询结果是:

3)升级指定版本(根据上面表格找到合适的版本升级):

如果出现某些冲突问题可以尝试先卸载再安装:

PS:另外一种方式你也可以先不升级指定版本,先使用如下命令查看本地版本:

比如我这里显示的就是:

那么我就应该安装支持 CUDA 10.0 的版本。可能 PyTorch 1.5 就不可用了,但是 PyTorch 1.4 还是可以的,可以使用如下命令安装:

具体什么版本支持可以参考:
https://download.pytorch.org/whl/torch_stable.html
这个页面。

参考文献

[1] https://blog.csdn.net/weixin_41278720/article/details/80778640
[2] https://discuss.pytorch.org/t/getting-nan-after-first-iteration-with-custom-loss/25929/14
[3] https://zllrunning.github.io/2018/03/24/20180324/

Add a Comment

Your email address will not be published.