PyTorch常见的12坑


向AI转型的程序员都关注了这个号👇👇👇python

机器学习AI算法工程   公众号:datayxgit


1. nn.Module.cuda() 和 Tensor.cuda() 的做用效果差别

不管是对于模型仍是数据,cuda()函数都能实现从CPU到GPU的内存迁移,可是他们的做用效果有所不一样。程序员

对于nn.Module:github



上面两句可以达到同样的效果,即对model自身进行的内存迁移。web

对于Tensor:面试

和nn.Module不一样,调用tensor.cuda()只是返回这个tensor对象在GPU内存上的拷贝,而不会对自身进行改变。所以必须对tensor进行从新赋值,即tensor=tensor.cuda().算法

例子:docker


2. PyTorch 0.4 计算累积损失的不一样

以普遍使用的模式total_loss += loss.data[0]为例。Python0.4.0以前,loss是一个封装了(1,)张量的Variable,但Python0.4.0的loss如今是一个零维的标量。对标量进行索引是没有意义的(彷佛会报 invalid index to scalar variable 的错误)。使用loss.item()能够从标量中获取Python数字。因此改成:flask


若是在累加损失时未将其转换为Python数字,则可能出现程序内存使用量增长的状况。这是由于上面表达式的右侧本来是一个Python浮点数,而它如今是一个零维张量。所以,总损失累加了张量和它们的梯度历史,这可能会产生很大的autograd 图,耗费内存和计算资源。安全

 

3. PyTorch 0.4 编写不限制设备的代码



4. torch.Tensor.detach()的使用

detach()的官方说明以下:



假设有模型A和模型B,咱们须要将A的输出做为B的输入,但训练时咱们只训练模型B. 那么能够这样作:

input_B = output_A.detach()

它可使两个计算图的梯度传递断开,从而实现咱们所需的功能。

 

5. ERROR: Unexpected bus error encountered in worker. This might be caused by insufficient shared memory (shm)

出现这个错误的状况是,在服务器上的docker中运行训练代码时,batch size设置得过大,shared memory不够(由于docker限制了shm).解决方法是,将Dataloader的num_workers设置为0.

 

6. pytorch中loss函数的参数设置

以CrossEntropyLoss为例:

  • 若 reduce = False,那么 size_average 参数失效,直接返回向量形式的 loss,即batch中每一个元素对应的loss.

  • 若 reduce = True,那么 loss 返回的是标量:

    • 若是 size_average = True,返回 loss.mean().

    • 若是 size_average = False,返回 loss.sum().

  • weight : 输入一个1D的权值向量,为各个类别的loss加权,以下公式所示:


  • ignore_index : 选择要忽视的目标值,使其对输入梯度不做贡献。若是 size_average = True,那么只计算不被忽视的目标的loss的均值。

  • reduction : 可选的参数有:‘none’ | ‘elementwise_mean’ | ‘sum’, 正如参数的字面意思,不解释。

7. pytorch的可重复性问题

参考这篇博文:https://blog.csdn.net/hyk_1996/article/details/84307108

 

8. 多GPU的处理机制

使用多GPU时,应该记住pytorch的处理逻辑是:

1.在各个GPU上初始化模型。

2.前向传播时,把batch分配到各个GPU上进行计算。

3.获得的输出在主GPU上进行汇总,计算loss并反向传播,更新主GPU上的权值。

4.把主GPU上的模型复制到其它GPU上。

 

9. num_batches_tracked参数

今天读取模型参数时出现了错误


大概能够看出,这个参数和训练时的归一化的计算方式有关。

所以,咱们能够知道该错误是因为训练和测试所用的pytorch版本(0.4.1版本先后的差别)不一致引发的。具体的解决方案是:若是是模型参数(Orderdict格式,很容易修改)里少了num_batches_tracked变量,就加上去,若是是多了就删掉。偷懒的作法是将load_state_dict的strict参数置为False,以下所示:



还看到有人直接修改pytorch 0.4.1的源代码把num_batches_tracked参数删掉的,这就很是不建议了。

 

10. 训练时损失出现nan的问题

最近在训练模型时出现了损失为nan的状况,发现是个大坑。暂时先记录着。

可能致使梯度出现nan的三个缘由:

1.梯度爆炸。也就是说梯度数值超出范围变成nan. 一般能够调小学习率、加BN层或者作梯度裁剪来试试看有没有解决。

2.损失函数或者网络设计。比方说,出现了除0,或者出现一些边界状况致使函数不可导,比方说log(0)、sqrt(0).

3.脏数据。能够事先对输入数据进行判断看看是否存在nan.

补充一下nan数据的判断方法:

注意!像nan或者inf这样的数值不能使用 == 或者 is 来判断!为了安全起见统一使用 math.isnan() 或者 numpy.isnan() 吧。

例如:


raise ValueError('Expected more than 1 value per channel when training, got input size {}'.format(size))


没有什么特别好的解决办法,在训练前用 num_of_samples % batch_size 算一下会不会正好剩下一个样本。

能够考虑将`DataLoader`的`drop_last`选项设为True,这样的话,当最后一个batch凑不满时,就会舍弃掉。

 

12. 优化器的weight_decay项致使的隐蔽bug

咱们都知道weight_decay指的是权值衰减,即在原损失的基础上加上一个L2惩罚项,使得模型趋向于选择更小的权重参数,起到正则化的效果。可是我常常会忽略掉这一项的存在,从而引起了意想不到的问题。

此次的坑是这样的,在训练一个ResNet50的时候,网络的高层部分layer4暂时没有用到,所以也并不会有梯度回传,因而我就放心地将ResNet50的全部参数都传递给Optimizer进行更新了,想着layer4应该能保持原来的权重不变才对。可是实际上,尽管layer4没有梯度回传,可是weight_decay的做用仍然存在,它使得layer4权值愈来愈小,趋向于0。后面须要用到layer4的时候,发现输出异常(接近于0),才注意到这个问题的存在。

虽然这样的状况可能不容易遇到,可是仍是要谨慎:暂时不须要更新的权值,必定不要传递给Optimizer,避免没必要要的麻烦。

 

13. 优化TensorDataset的数据加载速度

`TensorDataset`提供了已经彻底加载到内存中的矩阵的数据读取接口。在使用`TensorDataset`的时候,若是直接用`DataLoader`,会致使数据加载速度很是缓慢,严重拖慢训练速度,分析和解决方案详见https://huangbiubiu.github.io/2019/BEST-PRACTICE-PyTorch-TensorDataset/


原文地址 https://blog.csdn.net/hyk_1996/article/details/80824747




阅读过本文的人还看了如下文章:


TensorFlow 2.0深度学习案例实战


基于40万表格数据集TableBank,用MaskRCNN作表格检测


《基于深度学习的天然语言处理》中/英PDF


Deep Learning 中文版第一版-周志华团队


【全套视频课】最全的目标检测算法系列讲解,通俗易懂!


《美团机器学习实践》_美团算法团队.pdf


《深度学习入门:基于Python的理论与实现》高清中文PDF+源码


特征提取与图像处理(第二版).pdf


python就业班学习视频,从入门到实战项目


2019最新《PyTorch天然语言处理》英、中文版PDF+源码


《21个项目玩转深度学习:基于TensorFlow的实践详解》完整版PDF+附书代码


《深度学习之pytorch》pdf+附书源码


PyTorch深度学习快速实战入门《pytorch-handbook》


【下载】豆瓣评分8.1,《机器学习实战:基于Scikit-Learn和TensorFlow》


《Python数据分析与挖掘实战》PDF+完整源码


汽车行业完整知识图谱项目实战视频(全23课)


李沐大神开源《动手学深度学习》,加州伯克利深度学习(2019春)教材


笔记、代码清晰易懂!李航《统计学习方法》最新资源全套!


《神经网络与深度学习》最新2018版中英PDF+源码


将机器学习模型部署为REST API


FashionAI服装属性标签图像识别Top1-5方案分享


重要开源!CNN-RNN-CTC 实现手写汉字识别


yolo3 检测出图像中的不规则汉字


一样是机器学习算法工程师,你的面试为何过不了?


前海征信大数据算法:风险几率预测


【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目,让你掌握深度学习图像分类


VGG16迁移学习,实现医学图像识别分类工程项目


特征工程(一)


特征工程(二) :文本数据的展开、过滤和分块


特征工程(三):特征缩放,从词袋到 TF-IDF


特征工程(四): 类别特征


特征工程(五): PCA 降维


特征工程(六): 非线性特征提取和模型堆叠


特征工程(七):图像特征提取和深度学习


如何利用全新的决策树集成级联结构gcForest作特征工程并打分?


Machine Learning Yearning 中文翻译稿


蚂蚁金服2018秋招-算法工程师(共四面)经过


全球AI挑战-场景分类的比赛源码(多模型融合)


斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)


python+flask搭建CNN在线识别手写中文网站


中科院Kaggle全球文本匹配竞赛华人第1名团队-深度学习与特征工程



不断更新资源

深度学习、机器学习、数据分析、python

 搜索公众号添加: datayx  



机大数据技术与机器学习工程

 搜索公众号添加: datanlp

长按图片,识别二维码

本文分享自微信公众号 - 机器学习AI算法工程(datayx)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索