IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Calcul scientifique Python Discussion :

Procédure d'optimisation Python


Sujet :

Calcul scientifique Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Par défaut Procédure d'optimisation Python
    Bonjour à tous,

    Je travaille actuellement sur la biomécanique humaine et j'ai créé une procédure d'optimisation via Spyder me permettant d'optimiser des variables issues du logiciel de modélisation musculo squelettique Anybody. De façon à trouver le set de variables du modèle se rapprochant le plus de celui du sujet spécifique et ainsi créer le modèle le plus réaliste, je compare les efforts musculaires extraits de Anybody et ceux des expériences intégrés dans un fichier Spyder en utilisant l'erreur RMS. Enfin je minimise le gradient de la fonction objective par la fonction utilisant l'algorithme L_LFGS_B.
    Par ailleurs, je précise que l'ajout de "if __name__ == '__main__':" me permet de démarrer la procédure directment via Spyder.


    Mais voici mon problème, lorsque je clique sur Exécuter le fichier, j'obtiens l'erreur suivante :

    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "C:\Program Files\WinPython-64bit-2.7.5.3\python-2.7.5.amd64\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 523, in runfile
    execfile(filename, namespace)
    File "C:/Program Files/AnyBody Technology/OptimizationStudies/OptimizationStudies/Scripts/optimization_procedure.py", line 200
    ^
    SyntaxError: invalid syntax


    Ayant cherché à maintes reprises sur internet le problème, je ne trouve aucune réponse qui pourrait m'aider. Je vous demande donc de bien vouloir m'aider à corriger ma procédure s'il vous plait.
    Que pensez-vous de cet erreur ? D'où provient-elle ? Et surtout comment la résoudre ?

    Ps : j'utilise Python 2.7.5.3



    Cordialement,



    Thomas.

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    Salut,

    File "C:/Program Files/AnyBody Technology/OptimizationStudies/OptimizationStudies/Scripts/optimization_procedure.py", line 200
    Cette ligne veut dire que tu as une erreur dans ton script à la ligne 200. Sans cette dernière un peu dur de dire pourquoi, mais j'ai comme l'intuition que la vraie erreur est à la ligne 199: peut-être manque t'il une paranthèse en fin de ligne, ou ":"

    Peut-être aussi suis-je complètement à côté de la plaque!

    Ju

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Par défaut
    En réalité mon programme s'arrête à la ligne 199 par :

    #==============================================================================

    Je ne comprends pas d'où vient l'erreur !

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Par défaut
    La seconde a été résolue. Pourtant après le chargement du script huit erreurs apparaissent. Je vous mets ci-dessous la totalité du script qui n'est pas très long, ainsi que les erreurs. J'aimerais que vous m'aidiez à les résoudre s'il vous plait.

    Script :

    from __future__ import division
    from os import getcwd, path as op
    from numpy import array, sqrt, mean, hstack, max, zeros
    from anypytools.abcutils import AnyPyProcess
    from scipy.optimize import fmin_l_bfgs_b, fmin_tnc

    global iteration_counter
    iteration_counter = 0

    def setup_study(designvars):
    if designvars is None:
    designvars = array([1.0]*5)
    basepath = op.join( getcwd(), '..')
    app = AnyPyProcess(basepath, anybodycon_path = "F:/Program Files/AnyBody Technology/AnyBody.6.0/AnyBodyCon.exe",
    num_processes = 3, disp = False)
    loadmacro = 'load "ArmStrengthValidation.main.any" -def WriteOutputFiles=0'
    macrocmds = ['operation RunApplication', 'run']
    inputs = [('Main.DesignVars.ElbowFlexionCalFactor', designvars[0]),
    ('Main.DesignVars.ElbowExtensionCalFactor', designvars[1]),
    ('Main.DesignVars.ElbowExtension',designvars[2]),
    ('Main.DesignVars.ElbowPronation',designvars[3]),
    ('Main.DesignVars.ElbowSupination',designvars[4])]
    outputs = ['Main.Studies.ElbowFlexionParamStudy.Output.Strength.Val',
    'Main.Studies.ElbowExtensionParamStudy.Output.Strength.Val',
    'Main.Studies.ElbowPronationParamStudy.Output.Strength.Val',
    'Main.Studies.ElbowSupinationParamStudy.Output.Strength.Val']
    return (app, loadmacro, macrocmds, inputs,outputs)

    def eval_w_gradient(designvars,*arg):
    pertubation_factor = arg[0]
    global iteration_counter
    iteration_counter += 1
    print iteration_counter, 'Design vars:', designvars
    #Setup ond run study
    (app, loadmacro, macrocmds, inputs,outputs) = setup_study(designvars)
    (res, pert) = app.start_pertubation_job(loadmacro, macrocmds, inputs, outputs, perturb_factor = pertubation_factor)
    # Keys
    key_flex = outputs[0]; key_ext = outputs[1];
    key_pro = outputs[2]; key_sup = outputs[3]
    pertubations = zeros((len(designvars,)))
    for i in range(len(designvars)):
    pertubations[i] = metric(pert[key_flex][i], pert[key_ext][i],
    pert[key_pro][i], pert[key_sup][i])
    objective = metric(res[key_flex],res[key_ext],res[key_pro],res[key_sup])
    gradient = (pertubations-objective)/pertubation_factor
    print 'Objective:', objective
    print 'Gradient:', gradient
    return objective, gradient

    def metric(c_flex, c_ext, c_pro, c_sup):

    if isinstance(c_flex, list):
    c_flex = c_flex[0]
    if isinstance(c_ext, list):
    c_ext = c_ext[0]
    if isinstance(c_pro, list):
    c_pro = c_pro[0]
    if isinstance(c_sup, list):
    c_sup = c_sup[0]

    import experimental_data as data

    # Get mean normalized experimental data
    m_flex = mean(data.flexion_normalized,1)
    m_ext = mean(data.extension_normalized,1)
    m_pro = mean(data.pronation_normalized,1)
    m_sup = mean(data.supination_normalized,1)

    # Normalize computed strength arrays by strength in 90 e.flex, 0deg e. pro
    norm_factor = c_flex[6]
    c_flex = c_flex/norm_factor
    c_ext = c_ext/norm_factor
    c_pro = c_pro/norm_factor
    c_sup = c_sup/norm_factor

    # Calculate the RMS errors
    try:
    rms_flex = sqrt( sum(((c_flex-m_flex)/m_flex)**2))
    rms_ext = sqrt( sum(((c_ext-m_ext)/m_ext)**2))
    rms_pro = sqrt( sum(((c_pro-m_pro)/m_pro)**2))
    rms_sup = sqrt( sum(((c_sup-m_sup)/m_sup)**2))
    except TypeError:
    print 'Error in metric. Return 100'
    return 100
    # Calucate Weight for the metrics
    N_total = len(m_pro)+len(m_sup)+len(m_ext)+len(m_flex)
    weight = float(N_total) / array([len(m_flex), len(m_ext), len(m_pro),
    len(m_sup) ])
    return rms_flex*weight[0] + rms_ext*weight[1] + rms_sup*weight[2] + rms_pro*weight[3]


    if __name__ == '__main__':
    # e1 = eval_strength(array([1.2,1.,1.,1.,1.]),(1e-3))
    # e2 = eval_strength(array([1.,1.,1.,1.,1.]))
    x0 = array([1.0, 1.0, 1.0, 1.0, 1.0])
    epsilon = 1e-4 # pertubation to find gradient
    (x,f,d) = fmin_l_bfgs_b(func = eval_w_gradient,x0 = array([1.0, 1.0, 1.0, 1.0, 1.0]),args=(epsilon,),bounds = [(0.01,1.8), (0.01,1.8), (0.1,4), (0.1,4), (0.1,4)])

    Erreurs rencontrées :
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "F:\WinPython-64bit\python-2.7.5.amd64\lib\site-packages\spyder-2.2.1-py2.7.egg\spyderlib\widgets\externalshell\sitecustomize.py", line 538, in runfile
    execfile(filename, namespace)

    File "D:\Users\thomas\ArmStrengthModel\optimization_scripts\optimize_strength_copy.py", line 111, in <module>
    (x,f,d) = fmin_l_bfgs_b(func = eval_w_gradient,x0 = array([1.0, 1.0, 1.0, 1.0, 1.0]),args=(epsilon,),bounds = [(0.01,1.8), (0.01,1.8), (0.1,4), (0.1,4), (0.1,4)])

    File "F:\WinPython-64bit\python-2.7.5.amd64\lib\site-packages\scipy\optimize\lbfgsb.py", line 185, in fmin_l_bfgs_b
    **opts)

    File "F:\WinPython-64bit\python-2.7.5.amd64\lib\site-packages\scipy\optimize\lbfgsb.py", line 312, in _minimize_lbfgsb
    f, g = func_and_grad(x)

    File "F:\WinPython-64bit\python-2.7.5.amd64\lib\site-packages\scipy\optimize\lbfgsb.py", line 262, in func_and_grad
    f = fun(x, *args)

    File "F:\WinPython-64bit\python-2.7.5.amd64\lib\site-packages\scipy\optimize\optimize.py", line 58, in __call__
    fg = self.fun(x, *args)

    File "D:\Users\thomas\ArmStrengthModel\optimization_scripts\optimize_strength_copy.py", line 46, in eval_w_gradient
    (res, pert) = app.start_pertubation_job(loadmacro, macrocmds, inputs, outputs, perturb_factor = pertubation_factor)

    File "F:\WinPython-64bit\python-2.7.5.amd64\lib\site-packages\anypytools\abcutils.py", line 294, in start_pertubation_job
    result = self.start_param_job(loadmacro, mainmacro, inputs, outputs, perturb_factor)

    File "F:\WinPython-64bit\python-2.7.5.amd64\lib\site-packages\anypytools\abcutils.py", line 393, in start_param_job
    vararray = np.array(self.results[itask][outvar] )
    KeyError: 'Main.Studies.ElbowFlexionParamStudy.Output.Strength.Val'



    Merci par avance pour les courageux.

  5. #5
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    ouah, c'est un peu.... indigeste!

    Est-ce que tu pourrais soit éditer ton message soit en écrire un nouveau en copiant et collant ton code entre les balises [code] à l'aide du bouton #? De sorte que l'on puisse voir l'indentation.

    Sinon, je commencerais pas la dernière erreur levée:

    File "F:\WinPython-64bit\python-2.7.5.amd64\lib\site-packages\anypytools\abcutils.py", line 393, in start_param_job
    vararray = np.array(self.results[itask][outvar] )
    KeyError: 'Main.Studies.ElbowFlexionParamStudy.Output.Strength.Val'
    KeyError siginfie qu'il y a un problème avec la clé de ton dictionnaire self.results, soit la clé outvar soit la clé itask n'existe pas.

    Il semble que plusieurs scripts sont en jeux, quel est le nom du script que tu as posté (pour être sûr)?


    ju

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    from __future__ import division
    from os import getcwd, path as op
    from numpy import array, sqrt, mean, hstack, max, zeros
    from anypytools.abcutils import AnyPyProcess
    from scipy.optimize import fmin_l_bfgs_b, fmin_tnc
     
    global iteration_counter
    iteration_counter = 0
     
     
    def setup_study(designvars):
        if designvars is None:
            designvars = array([1.0]*5)
        basepath = op.join( getcwd(), '..')
        app = AnyPyProcess(basepath, anybodycon_path = "C:/Program Files/AnyBody Technology/AnyBody.6.0/anybodycon.exe",
    						num_processes = 3, disp = False)
        loadmacro = 'load "ArmStrength.main.any" -def WriteOutputFiles=0' 
        macrocmds = ['operation RunApplication', 'run']
        inputs = [('Main.DesignVars.ElbowFlexionCalFactor', designvars[0]),
                  ('Main.DesignVars.ElbowExtensionCalFactor', designvars[1]),
                  ('Main.DesignVars.ElbowExtension',designvars[2]), 
                  ('Main.DesignVars.ElbowPronation',designvars[3]), 
                  ('Main.DesignVars.ElbowSupination',designvars[4])]
        outputs =  ['Main.Studies.ElbowFlexionParamStudy.Output.Strength.Val',
                    'Main.Studies.ElbowExtensionParamStudy.Output.Strength.Val',
                    'Main.Studies.ElbowPronationParamStudy.Output.Strength.Val',
                    'Main.Studies.ElbowSupinationParamStudy.Output.Strength.Val']
        return (app, loadmacro, macrocmds, inputs,outputs)
     
     
     
    def evalualte(designvars,*arg):
        global iteration_counter
        iteration_counter += 1
        print iteration_counter, 'Design vars:', designvars
        #Setup and evalute objective function
        (app, loadmacro, macrocmds, inputs,outputs) = setup_study(designvars)
        res = app.start_param_job(loadmacro, macrocmds, inputs, outputs)
        # Keys
        key_flex = outputs[0]; key_ext = outputs[1]; 
        key_pro = outputs[2];key_sup = outputs[3]
        objective = metric(res[key_flex],res[key_ext],res[key_pro],res[key_sup])
        print 'Objective:', objective
        return objective
     
     
    def eval_w_gradient(designvars,*arg):
        pertubation_factor = arg[0]
        global iteration_counter
        iteration_counter += 1
        print iteration_counter, 'Design vars:', designvars
        #Setup ond run study    
        (app, loadmacro, macrocmds, inputs,outputs) = setup_study(designvars)
        (res, pert) = app.start_pertubation_job(loadmacro, macrocmds, inputs, outputs,
                                  perturb_factor = pertubation_factor)
        # Keys
        key_flex = outputs[0]; key_ext = outputs[1];
        key_pro = outputs[2];key_sup = outputs[3]
        pertubations = zeros((len(designvars,)) )
        for i in range(len(designvars)):
            pertubations[i] = metric(pert[key_flex][i], pert[key_ext][i],
                                     pert[key_pro][i],  pert[key_sup][i]) 
        objective = metric(res[key_flex],res[key_ext],res[key_pro],res[key_sup])
        gradient = (pertubations-objective)/pertubation_factor
        print 'Objective:', objective
        print 'Gradient:', gradient
        return objective, gradient
     
    def gradient(designvars, *arg):
        res, grad = eval_w_gradient(designvars, arg)
        return grad
     
     
    def metric(c_flex, c_ext, c_pro, c_sup):
        """Calculate the metric (objective value) based on Fabians experimental
        data
        Keyword arguments:
        c_flex -- computed result for elbow flexion strength
        c_ext -- computed result for elbow extension  strength
        c_pro -- computed result for elbow pronation strength
        c_sup -- computed result for elbow supination strength
        """
     
     
        if isinstance(c_flex, list):
            c_flex = c_flex[0]
        if isinstance(c_ext, list):
            c_ext = c_ext[0]
        if isinstance(c_pro, list):
            c_pro = c_pro[0]
        if isinstance(c_sup, list):
            c_sup = c_sup[0]
     
        import experimental_data as data
     
        # Get mean normalized experimental data
        m_flex = mean(data.flexion_normalized,1)
        m_ext = mean(data.extension_normalized,1)
        m_pro = mean(data.pronation_normalized,1)
        m_sup = mean(data.supination_normalized,1)
     
        # Normalize computed strength arrays by strength in 90 e.flex, 0deg e. pro
        norm_factor = c_flex[6]
        c_flex = c_flex/norm_factor
        c_ext = c_ext/norm_factor
        c_pro = c_pro/norm_factor
        c_sup = c_sup/norm_factor
     
        # Calculate the RMS errors
        try:
            rms_flex = sqrt( sum(((c_flex-m_flex)/m_flex)**2))
            rms_ext = sqrt( sum(((c_ext-m_ext)/m_ext)**2) )
            rms_pro = sqrt( sum(((c_pro-m_pro)/m_pro)**2))
            rms_sup = sqrt( sum(((c_sup-m_sup)/m_sup)**2))    
        except TypeError:
            print 'Error in metric. Return 100'
            return 100
        # Calucate Weight for the metrics    
        N_total = len(m_pro)+len(m_sup)+len(m_ext)+len(m_flex)
        weight = float(N_total) / array([len(m_flex),  len(m_ext), len(m_pro),
                                  len(m_sup) ] )  
        return rms_flex*weight[0] + rms_ext*weight[1] +    rms_sup*weight[2] + rms_pro*weight[3]
     
     
     
     
     
    if __name__ == '__main__':
    #    e1 = eval_strength(array([1.2,1.,1.,1.,1.]),(1e-3))
    #    e2 = eval_strength(array([1.,1.,1.,1.,1.]))
        x0 = array([1.0, 1.0, 1.0, 1.0, 1.0])
        epsilon = 1e-4   # pertubation to find gradient
        (x,f,d) =  fmin_l_bfgs_b(func = eval_w_gradient, 
                                 x0 = array([1.0, 1.0, 1.0, 1.0, 1.0]),
                                 args=(epsilon,),
                                 bounds = [(0.01,1.8),(0.01,1.8),(0.1,4), (0.1,4), (0.1,4)] )
    Désolé pour la lecture tu as raison c'est plus clair comme ça. Le nom de mon script est "optimize_strength_copy.py" qui apparait dans la deuxième erreur. Je regarde pour ta remarque.

Discussions similaires

  1. Règles d'optimisation Python
    Par memento80 dans le forum Général Python
    Réponses: 8
    Dernier message: 24/03/2012, 13h23
  2. Réponses: 11
    Dernier message: 26/11/2005, 13h00
  3. Réponses: 6
    Dernier message: 21/06/2005, 15h06
  4. Réponses: 5
    Dernier message: 09/05/2005, 12h24
  5. Réponses: 5
    Dernier message: 04/10/2004, 18h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo