Disons que j'ai une image descendante d'une flèche et que je veux prédire l'angle de cette flèche. Ce serait entre et degrés, ou entre et . Le problème est que cette cible est circulaire, et degrés sont exactement les mêmes, ce qui est une invariance que j'aimerais incorporer dans ma cible, ce qui devrait aider à généraliser de manière significative (c'est mon hypothèse). Le problème est que je ne vois pas une manière propre de résoudre ce problème, y a-t-il des documents qui tentent de résoudre ce problème (ou des similaires)? J'ai quelques idées avec leurs inconvénients potentiels:360 0 2 π 0 360
Utilisez une activation sigmoïde ou tanh, mettez-la à l'échelle ( et incorporez la propriété circulaire dans la fonction de perte. Je pense que cela échouera assez fort, car si c'est à la frontière (pire prédiction), seul un tout petit peu de bruit poussera les poids à aller dans un sens ou dans l'autre. De plus, les valeurs plus proches de la frontière de et seront plus difficiles à atteindre car la valeur absolue de pré-activation devra être proche de l'infini.0 2 π
Régression à deux valeurs, une valeur et et calculez la perte en fonction de l'angle de ces deux valeurs. Je pense que celui-ci a plus de potentiel mais la norme de ce vecteur est illimitée, ce qui pourrait conduire à une instabilité numérique et entraîner des explosions ou aller à 0 pendant l'entraînement. Cela pourrait potentiellement être résolu en utilisant un régularisateur étrange pour éviter que cette norme ne s'éloigne trop de 1.y
D'autres options seraient de faire quelque chose avec les fonctions sinus et cosinus mais je pense que le fait que plusieurs préactivations soient mappées sur la même sortie rendra également l'optimisation et les généralisations très difficiles.
la source
Réponses:
La deuxième façon, prédire et y = s i n ( α ) est tout à fait correcte.x = c o s ( α ) y= s i n ( α )
Oui, la norme du vecteur prévu n'est pas garantie d'être proche de 1 . Mais il est peu probable qu'il explose, surtout si vous utilisez des fonctions d'activation sigmoïdes (qui sont limitées par leur nature) et / ou régularisez bien votre modèle. Pourquoi votre modèle devrait-il prédire une grande valeur si tous les échantillons d'apprentissage étaient en [ - 1 , 1 ] ?( x , y) 1 [ - 1 , 1 ]
Un autre côté est le vecteur trop proche de ( 0 , 0 ) . Cela peut parfois se produire et pourrait en effet entraîner la prédiction de mauvais angles. Mais cela peut être considéré comme un avantage de votre modèle - vous pouvez considérer la norme de ( x , y ) comme une mesure de confiance de votre modèle. En effet, une norme proche de 0 signifie que votre modèle ne sait pas où est la bonne direction.( x , y) ( 0 , 0 ) ( x , y)
Voici un petit exemple en Python qui montre qu'il vaut mieux prédire le péché et le cos, que prédire directement l'angle:
Vous pouvez continuer et tracer les prédictions, pour voir que les prédictions du modèle sinus-cosinus sont presque correctes, bien qu'elles puissent nécessiter un étalonnage supplémentaire:
arctan2
la source
Travailler avec des coordonnées cartésiennes fonctionne bien comme mentionné ci-dessus. Pourtant, à mon avis, la conversion de données polaires en cartésiennes crée des dépendances entre les coordonnées X et Y qui n'étaient pas initialement présentes dans les données. Par exemple, le modèle de décision de trajectoire d'un robot est plus intuitif en coordonnées polaires que cartésien. La dépendance du vecteur vitesse du robot en coordonnées polaires entre l'angle et la magnitude peut même ne pas exister ou être différente de la dépendance en coordonnées cartésiennes.
Une solution de contournement que j'ai trouvée pour continuer à travailler avec les coordonnées polaires est de créer une fonction d'erreur personnalisée pour calculer la différence d'angle en utilisant la fonction angdiff () dans MATLAB et la différence de magnitude comme d'habitude.
Cette fonction renvoie '0' pour la différence entre -pi et pi. Voici un lien vers la page d'assistance des fonctions sur le site Web de Mathworks.
https://www.mathworks.com/help/robotics/ref/angdiff.html
Si vous utilisez l'activation sigmoïde et que vos données d'angles sont normalisées entre [0,1], vous devez les remettre dans la plage [-pi, pi] avant d'utiliser la fonction angdiff (), puis normaliser l'erreur sur la valeur [0,1 ] pour le processus de rétropropagation.
De plus, la fonction équivalente en Python serait:
Cela renvoie des résultats similaires à ceux de la fonction MATLAB et fonctionne également avec les tableaux:
J'espère que cela pourra aider.
la source