断言(assert)--学习

断言

在我学习编程时,我一直认为断言(assert)是个报错函数,事实上,它居然是个宏,并且作用并非"报错"。

我们先来看看百度的断言的含义:

  • 断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。

  • 使用断言可以创建更稳定、品质更好且 不易于出错的代码。当需要在一个值为FALSE时中断当前操作的话,可以使用断言。单元测试必须使用断言(Junit/JunitX)。

在经过对其进行一定了解之后,对其作用及用法有了一定的了解,断言assert是定义在assert.h中的 宏 ,只在debug版本起作用,而在release版本不起作用。用法:assert(表达式)

  • 当表达式的值为真的时候,也就是假设成立的时候,系统继续运行;但是当表达式的值为假,也就是假设不成立的时候,他就会中断程序执行,并且报告错误所在行。
 do
    {
        printf("input m(m>=0):");
        scanf("%d",&m);
    }while(m<0);     //当m>=0,不再输入
    assert(m>=0);    //退出上面的输入后,发现输入的值比0小,中断程序,断言为假

上面的代码中,assert(m>=0)的效果与语句if(m<0) exit(1);类似,理论上来说条件语句可以用来替代断言,但是使用条件语句后:

1.程序编译后的目标代码体积变大
2.降低最终发布的程序效率
 **使用断言**1.便于在程序调试时发现错误
2.不会影响程序执行效率

断言只能用于调试,不能作为程序的功能。断言不是用来检查程序的错误的,断言为假只会中断程序的执行,报告程序是错误的,而不会对错误进行相应的处理。断言不能用来判断有可能发生的情况是否会发生,不能对函数的入口参数进行合法性检查,不能用断言代替条件语句,不能用断言判断有可能发生的错误,只能用于检查程序中不能发生的错误确实不会发生

适合使用断言的情况:

  • 检查程序中各种假设的正确性,eg确定一个计算结果确实在合理的范围内;

  • 证明或者测试某种不可能发生的状况确实不会发生,eg:一些理论上不会被执行到的分支,确实不会被执行;

使用断言的基本原则:

  • 使用断言可以捕获不应该或者不可能发生的情况,不等同于非法情况

  • 一个assert只能检验一个假设

  • 12
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据给出的引用信息,这个错误是由CUDA报告的错误引起的,错误消息是"RuntimeError: CUDA error: device-side assert triggered"。个错误通常发生在使用CUDA计算时,当设备端的断言失败时会触发。 通常,这个错误是由网络训练中的某些问题引起的。根据提供的信息,有一些可能的原因导致这个错误发生。首先,可能是由于冻结训练期间主干网络的参数不适配数据集,并且出现了一些异常样本或者离群样本,从而导致回归损失的剧烈变化,进而影响学习器的学习。尝试解冻主干网络以使其参与训练,但仍然出现nan问题。 另一个可能原因是学习率设置过高。尽管训练集和验证集的损失在降低并且未出现过拟合现象,但仍然尝试将学习率降低为原来的1/10重新测试,但问题仍然存在。 最后,另一个可能的原因是学习器的选择不合适。通过输出主干网络和neck部分每轮的最大值,发现它们一直在增加,并且当达到100多时开始出现nan。尝试将优化器从Adam替换为SGD,这个问题得到了解决。此外,尝试了其他一些主干网络,也没有出现这个问题。 综上所述,你可以尝试以下解决方法: 1. 解冻主干网络,让其参与训练。 2. 尝试减小学习率。 3. 尝试使用其他适合的学习器。 希望这些解决方法能帮助你解决问题。如果你还有其他相关问题,请继续提问。 相关问题: 1. 这个错误是否只在使用CUDA计算时出现? 2. 还有其他可能导致这个错误的原因吗? 3. 如何判断学习率的设置是否合适?

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值