2017-11-03 3 views
0

파이썬 3.x 및 PyCharm을 사용하여 그라디언트 디센트를 만들려고합니다. 코드는 우아하지 않지만 작동했습니다. 하지만 여러 번 실행하면 "for"루프가 작동을 멈 춥니 다. 메모리 문제 또는 이와 비슷한 문제 일 수 있다고 생각하지만 문제가 있다면 해결 방법을 잘 모르겠습니다.루프가 매번 실행되지 않음 (파이썬)

thrust_forward() 
thrust = neu['d'] 
thrust_new = 0  

def back_and_forward(): 
    randomize_steps_effect() 
    thrust_backward() 
    thrust_forward() 

    global thrust_new 
    thrust_new = neu['d'] 

iterations = 5000000 

def start_process(): 
    print('') 
    print('Progress:') 
    for i in range (0,iterations): 
     global thrust_new 
     global thrust 

     while thrust_new < thrust: 
      back_and_forward() 

     thrust = thrust_new 
     if i%(iterations/100) == 0: 
      print('|', sep = '', end='', flush=True) 


    print('') 
    print('Final: P = ' +str(thrust/9.8) + str(prm)) 



start_process() 

주요 매개 변수는 사전에 저장됩니다

#Randomize steps 
    def randomize_steps_effect(): 
     for key, values in stp.items(): 
      r = random.randint(0,3) 
      if r != 0 and (key != 'm' or key != 'w'): 
       stp[key] *= -1 

앞뒤로 기능 :

#Parametres 
    prm = { 
     'm':3, #kg/s 
     ... 
     'ph':-50000 #Pa 
    } 


    #Parameters steps 
    stp = { 
     'a':0.01, 
     ... 
     'ph':50 #Pa 
    } 
    #Additional vars 
    neu = { 
     'a':0, 
     ... 
     'd':0 
    } 

이 단계에 대한 기능을 무작위, 그래서 "추력"결국이 증가하고 루프 휴식 시간 동안 :

def thrust_forward(): 
    neu['a'] = forward_multiply(prm['m'],prm['w']) 
    neu['c'] = forward_add(prm['pa'],prm['ph']) 
    neu['b'] = forward_multiply(neu['c'],prm['Fa']) 
    neu['d'] = forward_add(neu['a'],neu['b']) 

def thrust_backward(): 
    global max_w 

    neu['a'] += stp['a'] * backward_add() 
    neu['b'] += stp['b'] * backward_add() 
    prm['Fa'] += stp['Fa'] * backward_multiply_F_wrt_b(prm['Fa'],neu['c']) 
    neu['c'] += stp['c'] * backward_multiply_F_wrt_b(neu['c'],prm['Fa']) 
    prm['pa'] += stp['pa'] * backward_add() 
    prm['ph'] += stp['ph'] * backward_add() 
    prm['m'] += stp['m'] * backward_multiply_F_wrt_b(prm['m'],prm['w']) 
    if prm['w'] >= max_w: 
     stp['w'] = 0 
    prm['w'] += stp['w'] * backward_multiply_F_wrt_b(prm['w'],prm['m']) 
+3

다른 변수 값에 문제처럼 보이는 전역 변수를 사용하지 않아야합니다, 당신에게

제레미가 말한대로

을 도울 수 있습니다 prm, P, P_new가 어디에서 왔는지 보여줄 수 있습니다. 현재이 변수에 오류가 있습니다. 또한 함수에서 외부/전역 변수에 액세스하고있는 것으로 나타났습니다. 이 솔루션을 권장하지 않으며 최후의 수단으로 만 수행하므로이 연습을 최소화하고 매개 변수를 사용하고자 할 수 있습니다. –

+0

모든 전역 변수 대신 함수 인수 및 반환 값을 사용하면 코드를 훨씬 읽고 읽고 유지 보수 할 수 있습니다. –

답변

0

"for 루프가 작동을 멈췄다"는 것은 무엇을 의미합니까? 지정된 반복에서 차단되거나 런타임 예외가 발생하거나 그라디언트의 개선이 중지됩니다. 당신의 내부 루프는 결코 당신의 P_new 이후 while P_new < P: 지속적 그러나

을 감소 종료하지 않기 때문에 반복에서 차단 확실히 경우

, 내가 보는 문제는 다음 P = P_new을 할 때 당신이 P_new < P 마지막 부탁이다 문은 항상 거짓입니다.

는 전후 기능에 포함 된 코드를 보여줄 수 있다면 우리는 당신은 또한

+0

정말 댓글입니다. – SiHa

+0

일부 코드가 추가되었습니다. 단계별 표지판에 대한 무작위 화 도구가 있는데, 매개 변수를 통해 돌아갈 때 사용됩니다. 결국 P_new (마지막 편집에서 "thrust_new")가 오를 경우 증가합니다. – Vladimir

+0

당신이 맞았습니다. 랜덤 라이저에서 문제가 발생했습니다. 감사 – Vladimir

관련 문제