pytorch 中遇到的问题(持续更新中)

1.BUG:

RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation.

        什么是inplace operation:in-place operation在pytorch中是指改变一个tensor的值的时候,不经过复制操作,而是直接在原来的内存上改变它的值。可以把它成为原地操作符。

        pytorch中,通常加后缀“_”来表示原地运算符,例如.add_(),或者python中的 “+=”。


2.Bug:

RuntimeError: Expected object of backend CPU but got backend CUDA for argument #2 'weight'

这种情况通常是数据还在cpu上,又要用到gpu上计算导致的,可以尝试数据后面加上.cuda()。

cpu上的tensor和gpu上的tensor是太一样的:PyTorch中的数据类型为Tensor,Tensor与Numpy中的ndarray类似,同样可以用于标量,向量,矩阵乃至更高维度上面的计算。PyTorch中的tensor又包括CPU上的数据类型和GPU上的数据类型,一般GPU上的Tensor是CPU上的Tensor加cuda()函数得到。通过使用Type函数可以查看变量类型。系统默认的torch.Tensor是torch.FloatTensor类型。例如data = torch.Tensor(2,3)是一个2*3的张量,类型为FloatTensor; data.cuda()就将其转换为GPU的张量类型,torch.cuda.FloatTensor类型。

3.Bug:

xxxxxx is not implemented for type torch.LongTensor

尝试将torch.LongTensor转换为:torch.FolatTensor类型。


4.Bug:

bool value of Tensor with more than one value is ambiguous

函数或者可调用对象使用时候没有加括号。


5.注意:关于减少时间消耗

(1)只要是用到for循环都是在cpu上进行的,会消耗巨量的时间

(2)只要是用到生成矩阵这种操作都是在cpu上进行的,会很消耗时间。

(3)数据往cuda()上搬运会比较消耗时间,也就是说 .cuda()会比较消耗时间,能去掉就去掉。

(4)在服务器上,如果可以在一块gpu上运行就不要采用net = nn.DataParallel(net),这种gpu并行方式比单个gpu要耗时。

6. pytorch debug :断点调试 和 打印可能出错步的结果 真的可以很快的找到错误所在的地方

关于断点调试:pycharm单步调试 - qq_33485434的博客 - CSDN博客


7.UserWarning: To copy construct from a tensor

x= torch.tensor(x)  ------>    x= x.clone()

8.RuntimeError: Expected object of scalar type Long but got scalar type Float for argument #2 'mat2'(期望对象为标量类型长,但得到标量类型浮点数)

这个好奇怪,对于x= torch.matmul(x,one_hot_copy), 只要提前把x和one_hot_copy后面加上.float()就可以解决。


**9. 张量乘法(未定):

二维张量相乘: 二维矩阵相乘 A*B: A.mm(B), 多维矩阵相乘 A*B: A.matmul(B), 注意需要long()数据类型。tensor.mul(tensor)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容