Angenommen, ich habe ein Bild von oben nach unten von einem Pfeil und möchte den Winkel vorhersagen, den dieser Pfeil bildet. Dies wäre zwischen und 360 Grad oder zwischen 0 und 2 π . Das Problem ist, dass dieses Ziel kreisförmig ist, 0 und 360 Grad sind genau das gleiche, was eine Invarianz ist, die ich in mein Ziel integrieren möchte, was die Verallgemeinerung erheblich unterstützen sollte (dies ist meine Annahme). Das Problem ist, dass ich keinen sauberen Weg sehe, dies zu lösen. Gibt es Papiere, die versuchen, dieses Problem anzugehen (oder ähnliche)? Ich habe einige Ideen mit ihren möglichen Nachteilen:
Verwenden Sie eine Sigmoid- oder Tanh-Aktivierung, skalieren Sie sie auf den Bereich ( und beziehen Sie die kreisförmige Eigenschaft in die Verlustfunktion ein. Ich denke, das wird ziemlich schwer scheitern, denn wenn es an der Grenze ist (schlechteste Vorhersage), wird nur ein kleines bisschen Lärm die Gewichte dazu bringen, in die eine oder andere Richtung zu gehen. Außerdem ist es schwieriger , Werte zu erreichen, die näher an der Grenze zwischen 0 und 2 π liegen, da der absolute Voraktivierungswert nahezu unendlich sein muss.
Stellen Sie zwei Werte ein, einen und einen y- Wert, und berechnen Sie den Verlust basierend auf dem Winkel, den diese beiden Werte bilden. Ich denke, dieser hat mehr Potenzial, aber die Norm dieses Vektors ist unbegrenzt, was zu numerischer Instabilität und zu Explosionen oder 0 während des Trainings führen kann. Dies könnte möglicherweise durch die Verwendung eines seltsamen Regularisierers behoben werden, um zu verhindern, dass diese Norm zu weit von 1 abweicht.
Andere Optionen würden etwas mit Sinus- und Cosinusfunktionen zu tun haben, aber ich denke, dass die Zuordnung mehrerer Voraktivierungen zu demselben Ausgang auch die Optimierung und Verallgemeinerung sehr schwierig macht.
quelle
Antworten:
Die zweite Möglichkeit, und y = s i n ( α ) vorherzusagen, ist völlig in Ordnung.x=cos(α) y=sin(α)
Ja, es ist nicht garantiert, dass die Norm des vorhergesagten Vektors in der Nähe von 1 liegt . Es ist jedoch unwahrscheinlich, dass es in die Luft geht, insbesondere wenn Sie Sigmoid-Aktivierungsfunktionen (die von Natur aus eingeschränkt sind) verwenden und / oder Ihr Modell gut regulieren. Warum sollte Ihr Modell einen großen Wert vorhersagen, wenn alle Trainingsmuster in [ - 1 , 1 ] waren ?(x,y) 1 [−1,1]
Eine andere Seite ist der Vektor zu nahe an ( 0 , 0 ) . Dies kann manchmal vorkommen und dazu führen, dass falsche Winkel vorhergesagt werden. Dies kann jedoch als Vorteil Ihres Modells angesehen werden - Sie können die Norm von ( x , y ) als Maß für das Vertrauen Ihres Modells betrachten. In der Tat bedeutet eine Norm nahe 0, dass Ihr Modell nicht sicher ist, wo die richtige Richtung ist.(x,y) (0,0) (x,y)
Hier ist ein kleines Beispiel in Python, das zeigt, dass es besser ist, sin und cos vorherzusagen, den Winkel direkt vorherzusagen:
Sie können fortfahren und die Vorhersagen zeichnen, um zu sehen, dass die Vorhersagen des Sinus-Cosinus-Modells nahezu korrekt sind, obwohl möglicherweise eine weitere Kalibrierung erforderlich ist:
arctan2
quelle
Das Arbeiten mit kartesischen Koordinaten funktioniert wie oben erwähnt. Meiner Meinung nach führt die Konvertierung von polaren Daten in kartesische Daten jedoch zu Abhängigkeiten zwischen den X- und Y-Koordinaten, die ursprünglich nicht in den Daten vorhanden waren. Beispielsweise ist das Bahnentscheidungsmodell eines Roboters in Polarkoordinaten intuitiver als kartesisch. Die Abhängigkeit des Geschwindigkeitsvektors des Roboters in Polarkoordinaten zwischen dem Winkel und der Größe besteht möglicherweise nicht einmal oder unterscheidet sich nicht von der Abhängigkeit in kartesischen Koordinaten.
Eine Problemumgehung, die ich gefunden habe, um weiterhin mit Polarkoordinaten zu arbeiten, besteht darin, eine benutzerdefinierte Fehlerfunktion zu erstellen, mit der die Winkeldifferenz mit der Funktion angdiff () in MATLAB und der Größenunterschied wie gewohnt berechnet werden.
Diese Funktion gibt '0' für die Differenz zwischen -pi und pi zurück. Hier ist ein Link zur Funktionsunterstützungsseite auf der Mathworks-Website.
https://www.mathworks.com/help/robotics/ref/angdiff.html
Wenn Sie die Sigmoid-Aktivierung verwenden und Ihre Winkeldaten zwischen [0,1] normalisiert sind, sollten Sie sie vor Verwendung der Funktion angdiff () in den Bereich [-pi, pi] zurückführen und den Fehler dann wieder auf [0,1] normalisieren ] Bereich für den Backpropagation-Prozess.
Die äquivalente Funktion in Python wäre außerdem:
Dies gibt ähnliche Ergebnisse wie die MATLAB-Funktion zurück und funktioniert auch mit Arrays:
Ich hoffe, das hilft.
quelle