而无限循环python

2024-10-06 11:22:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我明白这是怎么回事,我只想知道在他进入无限循环之前如何捕捉我的程序。我的代码是:

while abs(error) > 50:
    if Co > To:
        c = c + 0.1
    else:
        c = c - 0.1

    ##Here I recalculate Co, the function is Co = 1/b type curve
    ##Here I recalculate To, the function is To = e^b type curve

    error = Co - To

问题是,根据问题的不同,我有时需要更精确(例如,我需要将迭代行更改为c+0.00001),因为在每个循环中,错误从低于50的值跳到超过50的值。我怎么能抓住这样一个无限循环。在


Tags: theto代码程序ifhereistype
2条回答

我想这是一个趋同的问题。这几天我的数学foo有点让我失望,但是如果你担心你会陷入一个无法收敛的境地,你可以在循环中添加一些计数器。在

limit = 1000
while abs(error) > 50:
    limit -= 1
    if limit == 0:
        raise SomeError
    your_calcs

这有点残酷,但至少解决了上吊的问题。听起来好像你不能保证这个循环会结束,因为代码/数据不断变化。如果无限循环的情况发生了,我希望看到一个错误,这样我就可以调查它。取决于你的问题领域。在

我想如果你不想继续学习的话,我想你应该停止学习。在

基本的想法是,当你看不到你的abs误差变化时,慢慢减少你对你的数值的干扰,同时保持整个过程的稳定性。如果你已经降低了你的学习率,但你仍然没有看到任何改善,你就完成了(或者至少是某种局部的最低限度)。这个方法可能会慢一点,而且计算我输入的变量有不同的方法(例如,sigErrChange),所以你得玩玩一下。还有一些其他的注意事项我想不起来了,但希望这能让大家明白我的想法。在

例如

lR = 1.0
updatedLR = False # Have we updated the learning rate this iteration?
while abs(error) > 50 and ( sigErrChange or updatedLR ):
    sigErrChange = False # Has there been a significant improvement in the error? (Probably shouldn't just use a single iteration for this...)

    # Are we adding or subtracting 
    if C > T:
        sign = 1.
    else:
        sign = -1.

    # Should we update the learning rate?
    if (~sigErrChange)
        updatedLR = True
        lR = .95 * lR

    # Calculate our values
    c = c + sign*lR*.001

    C = calcC(c, C, T)
    T = calcT(c, C, T)

    error = C - T

相关问题 更多 >