先写下错误原因和出现的时候,暂时没有解决,等到解决了来补充解决方案
ret = torch._C._nn.smooth_l1_loss(expanded_input, expanded_target, _Reduction.get_enum(reduction))
RuntimeError: reduce failed to synchronize: an illegal memory access was encountered
第一次出现的时候,出现在test过程,其实蛮奇怪的,test和train使用的是一个loss函数但是test的时候就会报这个错误,但是train的时候并不会,这一次由于test的时候不需要传递梯度,所以我用把这个loss写成了numpy版本的,就解决了这个错误。
第二次出现是在换成了ps roialign的时候,train的阶段就报出了这个错误。
暂时排除了一个原因:一开始以为可能loss函数的两个变量,一个在CPU上,一个在GPU上。但是使用了代码查看发现都在GPU上。
print(out.device)
print(MOS.device)
此次问题解决,但是没有根本解决,同时也记录另一个问题吧。
首先解决方法,是换了一个代码,此部分代码是用cuda编程的,自己并不会,所以都是在github上找的。
贴上github链接,此代码可正常运行在pytorch1.1.0版本。
https://github.com/TreB1eN/Lighthead-RCNN-in-Pytorch0.4.1
此问题暂时解决,解决的两个方法可看下一篇博文。
其次,记录此代码 出现的问题,由于在反向传播封装的时候,这份代码的py部分代码没有给数据加上一个条件,会报此类错误。
RuntimeError: top_diff must be contiguous
这个解决的办法很简单找到封装的py文件对应的地位,此文件在于
def backward(ctx, top_diff):
spatial_scale = ctx.spatial_scale
roi_size = ctx.roi_size
sampling_ratio = ctx.sampling_ratio
pooled_dim = ctx.pooled_dim
batch_size, channels, height, width = ctx.feature_size
[bottom_rois, argmax_data] = ctx.saved_tensors
bottom_diff = None
if ctx.needs_input_grad[0]:
bottom_diff = torch.zeros([batch_size, channels, height, width], dtype=torch.float32).to(top_diff.device)
psroialign_cuda.backward(top_diff.contiguous(), argmax_data, bottom_rois, bottom_diff, spatial_scale, roi_size, sampling_ratio)
return bottom_diff, None, None, None, None, None
在top_diff后加上.contiguous()即可。