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)