BUG1

在使用NLLLoss()激活函数时,NLLLoss用来做n类分类的,一般最后一层网络为LogSoftmax,如果其他的则需要使用CrossEntropyLoss。其使用格式为:loss(m(input), target),其中input为2DTensor大小为(minibatch,n),target为真实分类的标签。

如果输入的input类型为torch.cuda.FloatTensor,target类型为torch.cuda.IntTensor,则会出现如下错误:

因此需要保证target类型为torch.cuda.LongTensor,需要在数据读取的迭代其中把target的类型转换为int64位的:target = target.astype(np.int64),这样,输出的target类型为torch.cuda.LongTensor。(或者在使用前使用Tensor.type(torch.LongTensor)进行转换)。

为了说明pytorch中numpy和toch的转换关系,测试如下:

首先输入int32的numpy数组转换为torch,得到的IntTensor类型

如果输入的为int64的numpy,得到LongTensor类型:

如果把int32的数组转换为LongTensor,则会出错:

如果把int64的数组转换为LongTensor,正常:

PS: 2017/8/8(奇怪,在使用binary_cross_entropy进行分类时又要求类型为FloatTensor类型,简直够了)

BUG2

同样是NLLLoss()使用时的问题。网络传播都正常,但是在计算loss时出现如下错误: 
RuntimeError: cuda runtime error (59) : device-side assert triggered at /home/loop/pytorch-master/torch/lib/THC/generic/THCTensorMath.cu:15

断点调试发现数据类型出现如下变化:

我以为显卡除了问题,最后在pytoch#1204中发现一个人的标签中出现-1,发生了类似的错误: 

而我的标签为1~10,最后把标签定义为1~9,解决这个问题。^_^!

BUG3

当使用torch.view()时出现 RuntimeError: input is not contiguous at /home/loop/pytorch-master/torch/lib/TH/generic/THTensor.c:231

这个是由于浅拷贝出现的问题。 
如下:定义初始化一个Tensor值,并且对其进行维度交换,在进行Tensor.view()操作时出现以上错误。

这是由于浅拷贝的原因,y只是复制了x的指针,x改变,y也要随之改变,如下:

可以使用tensor.contiguous()解决:

BUG4

按照官网的方式编译PyTorch源码时出现:undefined reference to ... @GLIBCXX_3.4.21 (未定义的引用问题) 我的是出现在编译90%左右的broadcast_test附近出现的。问题估计是GCC的版本造成的,虽然GCC -v显示的5.0,但是调用的库不是,需要执行:

conda install libgcc

然后python setup.py clean重新生成即可解决问题

BUG5

使用Cross_entropy损失函数时出现 RuntimeError: multi-target not supported at …

仔细看其参数说明:

input has to be a 2D Tensor of size batch x n. This criterion expects a class index (0 to nClasses-1) as the target for each value

of a 1D tensor of size n

其标签必须为0~n-1,而且必须为1维的,如果设置标签为[nx1]的,则也会出现以上错误。


NOTE1 共享参数问题

在tensorflow中有variable_scope方法实现参数共享,也就是说对于2张图片,第二张训练时的权重参数与第一张图片所使用的相同,详见tf.variable_scope. 同样,在PyTorch则不存在这样的问题,因为PyTorch中使用的卷积(或者其他)层首先需要初始化,也就是需要建立一个实例,然后使用实例搭建网络,因此在多次使用这个实例时权重都是共享的。

NOTE2  torch.nn.Module.cuda 作用

之前看教程中在定义完网络后会进行:

现在才发现这个的作用,官方文档上写的是:Moves all model parameters and buffers to the GPU.

也就是在定义时并没有把weight参数传入gpu中,在调用网络进行计算时,如果传入的数据为GPU数据,则会出现:tensors are on different GPUs 错误,因此使用torch.nn.Module.cuda可以把定义的网络参数传入gpu中。

NOTE3 对同一网络连续两次对同一梯度求解(backward)

如果使用一个Variable数据传入到网络,通过backward求解其梯度值,然后在使用另一个Variable传入网络,再次求解梯度值,其最终结果会怎么样呢?正如你所想得样,是两次梯度之和。测试代码如下:

定义一个一层的线性网络,并且其权重(weight)和偏置(bias)都初始化为0,在每次求解梯度后输出梯度值,其结果如下:

可以发现,在进行梯度求解前,没有梯度,在第一次计算后梯度为-1,第二次计算后为-2,如果在第一次求解后初始化梯度net.zero_grad(),则来嗯次都是-1,则连续多次求解梯度为多次梯度之和。

NOTE4 pytorch自定义权重初始化

在上面的NOTE3中使用自定意的权重参数初始化,使用toch.nn.Module.apply()对定义的网络参数进行初始化,首先定义一个权重初始化的函数,如果传入的类是所定义的网络,则对其权重进行in_place赋值。

如果对weight_init(m)中的classname输出,可以发现有多个类:(因此需要判断是否为所定义的网络)

NOTE5 pytorch权重的更新

关于网络传递中网络的定义、loss计算、backpropogate的计算,update weight在Neural Networks有简单介绍,这里测试下。只要定义一个优化器(optimizer),实现了常见的优化算法(optimization algorithms),然后使用优化器和计算的梯度进行权重的更新。

在NOTE3中的代码后面增加如下(更新权重参数):

其运行结果为:

可见使用optimizer.step()实现了网络权重的更新。(而且可以选择不同的更新方式,如:Adam、SGD等)

NOTE6  torch.autograd.backward()使用技巧

当计算多个梯度相加(相减)时,使用backward(torch.FloatTensor([-1]))可以简单实现。

NOTE7  监控内存使用,防止内存泄漏memory leak

代码如下:


原文链接:http://blog.csdn.net/u011276025/article/details/73826562

欢迎关注深度学习自然语言处理公众号,我会在这里记录自己在路上的一点一滴!期待和你一起进步!

PyTorch(总)---PyTorch遇到令人迷人的BUG与记录相关推荐

  1. Lesson 7 (3) 深入理解PyTorch与PyTorch库架构

    我们已经理解了神经网络是如何诞生的,也了解了怎样的算法才是一个优秀的算法,现在我们需要借助深度学习框架(Deep learning framework)来帮助我们实现神经网络算法.在本门课程中,我们所 ...

  2. Java中一个令人惊讶的bug

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 今天分享一个JDK中令人惊讶的BUG,这个BUG的神奇之处在于,复 ...

  3. 1.0 深度学习回顾与PyTorch简介 - PyTorch学习笔记

    P1 深度学习回顾与PyTorch简介 视频课程地址:点我 fly~~~ 本节课主要偏向于NLP,因为作者本人是做NLP方向NLP 预训练三种模型: BERT OpenAI GPT ELMo [NLP ...

  4. 【0基础入门Pytorch】Pytorch的简介与安装(Windows)

    任务内容: Pytorch简介 Pytorch的安装步骤 1. Pytorch简介 PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序.它主要由Facebook ...

  5. 【Pytorch】| Pytorch中softmax的dim的详细总结

    [Pytorch]| Pytorch中softmax的dim的详细总结 关于softmax的理解 一维向量:dim=0和dim=-1结果相同,dim=1和dim=2会报错 二维张量:dim=1和dim ...

  6. [Pytorch框架] PyTorch 中文手册

    PyTorch 中文手册 书籍介绍 这是一本开源的书籍,目标是帮助那些希望和使用PyTorch进行深度学习开发和研究的朋友快速入门. 由于本人水平有限,在写此教程的时候参考了一些网上的资料,在这里对他 ...

  7. Pytorch Note1 Pytorch介绍

    Pytorch Note1 Pytorch介绍 PyTorch的诞生 常见的深度学习框架简介 为什么选择PyTorch 总结一下Pytorch的特点 Python 优先 命令式体验 快速精益 安装 全 ...

  8. ML之回归预测:利用十(xgboost,10-1)种机器学习算法对无人驾驶汽车系统参数(2017年的data,18+2)进行回归预测值VS真实值——bug调试记录

    ML之回归预测:利用十(xgboost,10-1)种机器学习算法对无人驾驶汽车系统参数(2017年的data,18+2)进行回归预测值VS真实值--bug调试记录 目录 输出结果 1.增加XGBR算法 ...

  9. 软件测试bug文档模板,软件bug测试记录模板

    软件bug测试记录模板 XXX软件bug测试记录表 文档编号: 背景信息 项目名称 测试目的 硬件环境 软件环境 测试时间 测试人员 测试说明 1.严重等级: A-Crash(崩溃的):由于程序所引起 ...

  10. 多线程bug处理记录

    原创:多线程bug处理记录 多线程bug处理记录 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Thread(target=func02) while True:dataA= ...

最新文章

  1. 产品经理提升修炼的方法
  2. python有没有帮助_没想到,python给我的帮助竟然这么大
  3. arima模型怎么拟合_7个统计测试,用于验证和帮助拟合ARIMA模型
  4. vscode设置折行字数
  5. exe4j打包jar成exe文件(将jdk打包在内)
  6. Python新建文件夹
  7. POSIX 线程清理函数
  8. 卸载不了mysql2008_卸载SQL2008遇到的问题及解决办法
  9. wamp php不可用_PHPWAMP开启php
  10. 手把手搭建K3cloud插件开发环境
  11. php+未找到驱动程序,显示未找到驱动程序,怎么办?
  12. Apktool命令使用总结
  13. 关爱女性健康的移动产品竞品分析报告
  14. Kaggle TMDB 票房预测挑战赛
  15. csapp炸弹实验_bomb_lab详解
  16. PIC16F C语言测频率程序,PIC单片机C语言程序—实例5
  17. linux清空网络错误包,centos – 删除包时PREUN scriptlet中的yum错误
  18. deepin linux64,Linux Deepin系统2014.1版For Linux-64(2014年8月29日发布) Linux Deepin系统2014.1版 其他 Linux...
  19. TrustData 2015年Q3中国移动互联网与双十一移动电商数据报告
  20. 产品经理(14)-金融圈需求app

热门文章

  1. maven打包不执行测试用例
  2. ARDUINO使用GPRS发送GPS数据到OneNet测试
  3. hadoop1.x异常
  4. SharpZipLib解压缩时中文名乱码[解决]
  5. java day32【HTML标签:表单标签 、CSS】
  6. 【机器学习_2】机器学习资料
  7. [微软官网] SQLSERVER 执行页面还原
  8. 前台页面操作文件属性。
  9. linux service start|stop|restart
  10. linux之C编程学习——getchar()和getch()