记录一个pytorch训练过程中的奇怪错误(解决) psroialign

先写下错误原因和出现的时候,暂时没有解决,等到解决了来补充解决方案

 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()即可。

你可能感兴趣的:(深度学习,调参)