记录一个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()即可。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在深度学习的训练,early stop(提前停止)是一种常用的策略,用于避免模型过拟合。PyTorch提供了一种方便的方式来实现early stop。 early stop是通过监控模型在验证集上的性能来实现的。训练过程,我们会在每个epoch结束后计算模型在验证集上的性能指标(例如准确率、损失函数值等),并与之前的最佳性能进行比较。如果当前性能较好,则更新最佳性能,并保存模型的参数(权重和偏置)。如果连续多个epoch的性能没有提升,则我们可以提前终止训练,以防止过拟合。 在PyTorch,实现early stop可以使用一个变量来记录最佳性能,一个变量来记录连续的性能下降次数,以及一个变量来保存当前最佳模型的参数。 在每个epoch结束后,我们可以根据验证集的性能来更新这些变量。如果当前性能较好,则更新最佳性能和模型参数。如果性能下降,则将连续下降次数加1;如果连续下降次数达到一定阈值(可以根据需求设置),则终止训练。 可以使用一个循环来实现early stop。在每个epoch的循环,首先计算模型在验证集上的性能,并与之前的最佳性能进行比较。如果当前性能较好,更新最佳性能和模型参数;如果性能下降,将连续下降次数加1。然后检查连续下降次数是否达到阈值,如果达到则终止训练。 在early stop过程,我们可以使用PyTorch的模型保存功能来保存最佳模型的参数,以便后续测试或使用。此外,还可以使用PyTorch提供的训练监控工具(例如TensorBoard)来可视化训练过程的性能变化,方便实时监控模型的训练情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值