[gelöst] Vector ist wesentlich langsamer als Array?
-
(1) vielleicht ist ja auch deine tanh zu langsam???
würde natürlich auch noch schneller gehen:
tanh(x)~ 1-2/(exp(2*x)+1)Na ja der Tanh hat nur einen geringen Bruchteil ausgemacht und
tanh(x)~ 1-2/(exp(2*x)+1) habe ich schon ausprobiert. (mit tanh und
exp auf math.h) Das hat keine Beschleunigung gebracht.Zu deinem Code aber noch eine Frage:
Wenn ich das kompeliere kommen eine Menge Fehlermeldungen.
"integer constant is too large for "long"
"expected constructorm, destructor, or type conversion before "void""
und einiges mehr. In welchen Kontext muss ich das stellen damit es
funktioniert. (irgendwelche Header einfügen...)(2) Für ein BackpropNN ist float ausreichend präzise
Das stimmt natürlich, aber ich habe double genutzt, da
mein Übungsleiter in Java ebenfalls double verwendet hatte
und ich so vergleichbar sein wollte.
-
zeusosc schrieb:
memcpy((void*)&d,(void*)&i,8);
Wer hat dir denn beigebracht, dass man hier casten muss? Wie ekelhaft und gleichzeitig verwirrend.
-
Wollte mal den Visual Studio 2010 profiler drüberlaufen lassen, aber Code ist bei mir nicht kompilierbar.
Mich wundert wie das hier:
int length = this->training_set_A.size() + this->training_set_B.size() - 1; int length_A = this->training_set_A.size(); int number[length]; //error C2057: expected constant expression
bei dir funktioniert haben soll
Dazu noch ein paar Kleinigkeiten mit string.compare, lies sich aber schnell beheben...
Nach Korrektur ist mir aufgefallen, das mir sein set an testdaten fehlt
-
kleiner Troll schrieb:
Wollte mal den Visual Studio 2010 profiler drüberlaufen lassen, aber Code ist bei mir nicht kompilierbar.
Mich wundert wie das hier:
int length = this->training_set_A.size() + this->training_set_B.size() - 1; int length_A = this->training_set_A.size(); int number[length]; //error C2057: expected constant expression
bei dir funktioniert haben soll
Dazu noch ein paar Kleinigkeiten mit string.compare, lies sich aber schnell beheben...
Nach Korrektur ist mir aufgefallen, das mir sein set an testdaten fehlt
Na ja zu den Testdaten: ich könnte sie dir Schicken sind aber nur unspektakuläre
2-D Daten, die meist irgendwie in Normalverteilungen im Raum liegen. Häufig ähnlich verteilt wie ein "XOR-Problem". (Was ich aber nur vom Namen her aufgeschnappt habe) Ja und bei meinem Dev C++ und dem g++ in der Uni gab es keine Probleme und ich seh auhc nicht wo ein Problem liegen sollte.
-
Wenn du Visual Studio hast, dann schau mal, dass du "Release" eingestellt hast. Wenn es dann immer noch langsam ist nimmst du z.B. Intel VTune Amplifier XE 2011 und schaust dir an was Zeit braucht, ich glaub da gibts eine kostenlose Demo.
-
ComputerCarl schrieb:
und ich seh auhc nicht wo ein Problem liegen sollte.
Arrays variabler Länge gibt es in C++ nicht, außer bei manchen Compilern als spezielle Erweiterung.
-
SeppJ schrieb:
ComputerCarl schrieb:
und ich seh auhc nicht wo ein Problem liegen sollte.
Arrays variabler Länge gibt es in C++ nicht, außer bei manchen Compilern als spezielle Erweiterung.
Genau, der GCC unterstützt das zum Beispiel. Der Compiler von MSVC++ hingegen nicht.
-
Wollte hier auch keinen Flamewar lostreten. Ich weiß des es einige compiler unterstützen, dachte aber vorallem eher ältere. Find sowas zumindest nicht schön. Ist aber auch egal. (Das andere Problem war, das es - eigentlich - im standard kein string::operator!= gibt, lies sich aber leicht durch string.compare ersetzen)
Das eigentliche Problem ist, ohne Testdaten kann ich den Profiler halt nicht laufen lassen, und würde mich schon interessieren was da soviel performance kostet. Spekulieren kann man ja viel. Wenn es aber allgemein auftritt, kann ich mir sowas ja durchaus selbst erstellen. Welche Dimensionen hat so ein typischer Fall?
-
kleiner Troll schrieb:
(Das andere Problem war, das es - eigentlich - im standard kein string::operator!= gibt, lies sich aber leicht durch string.compare ersetzen)
Türlich gibts den.
-
Also es fällt mir schon beim überfliegen auf, dass hier, wie von anderen bereits vermutet, jede Menge versteckte Kopien von großen Objekten gemacht werden, außerdem wird die Dynamik der Vectoren, wenn ich das recht sehe, überhaupt nicht benutzt, so dass ein std::array oder ein 1D-Vectorwrapper das richtige wären.
Ein Fall vom berüchtigten
Bjarne Stroustrup schrieb:
C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off.
-
-
Türlich gibts den.
Tschuldige, falsch geschaut, hat bei mir aber trotzdem nicht kompiliert, ka wieso, is mir atm auch egal.
-
314159265358979 schrieb:
zeusosc schrieb:
memcpy((void*)&d,(void*)&i,8);
Wer hat dir denn beigebracht, dass man hier casten muss? Wie ekelhaft und gleichzeitig verwirrend.
neee,.. entschuldige es war gemeint
anstelle:
__get_sc__int(_8fak_inv,_tF); ret=_tF; ret*=_sq_x; __get_sc__int(_6fak_inv,_tF); ret+=_tF; ret*=_sq_x; __get_sc__int(_4fak_inv,_tF); ret+=_tF;
einfach:
ret=(double)_8fak_inv; ret*=_sq_x; ret+=(double)_6fak_inv;; ret*=_sq_x; ret+=(double)_4fak_inv;;
Damit spart man sich auch noch die memcpy, da der Compiler das direkt als double
interpretiert...grüüße
-
Wenn du noch die C++-Casts verwendest, bin ich ganz zufrieden.
-
Ich bin wahrlich kein erfahrener Programmierer. Das ist ein Fakt.
Es ist nur so, dass ich keine Alternative produzieren kann.vector< vector<double> > M;
-> die erste Schicht M[i] gibt mir eine variable Anzahl an Schichten an
-> die zweite Schicht M[i][j] gibt mir für jede einzelne Schicht wieder eine
variable Anzahl an Neuronen an.
Diese werden im Konstruktor festgelegt und an das private Attribut übergeben.
(this->M). Danach wird der Konstuktor beendet und learning wird aufgerufen.Ich bin nur so weit, dass ich wenn Arrays benutzte eine konstante Anzahl an Elementen festlegen muss. (-> ist ja nicht gegeben) Weiterhin, wenn ich im Konstruktor mit Referenzen umgehe, wird doch nach dem Konstruktor sämtliche Daten die dort erstellt worden gelöscht. Und sollte ich die Referenz als Attribut gespeichert haben, so deutet sie nach Beendigung des Konstruktors auf einen "toten" Wert. Also weiß ich nicht wie ich die Attribute this->M und this->w auf Arrays umstellen kann. Mehrdimensionale Arrays können meines Wissens nur als Referenzen erstellt werden.
-> Ich sehe in meinem begrenzten Wissen also keine Alternative.Ist es vielleicht möglich, dass einfach weniger Vorwissen in den Kommentaren vorausgesetzt wird, damit ich eine etwas praktischere Anleitung herauslesen kann, um mein Problem zu lösen? Ich komm einfach nicht wirklich weiter. Für Literaturempfellungen bin ich auch höchst dankbar.
-
ret=static_cast<double>(_8fak_inv); ret*=_sq_x; ret+=static_cast<double>(_6fak_inv); ret*=_sq_x; ret+=static_cast<double>(_4fak_inv);
Ok,.. also nach der Konstruktion hast Du aber eine fixe anzahl an Schichten und
Neuronen?
-
Hat mir das mit dem operator!= doch keine Ruhe gelasen, der Grund warums bei mir nicht ging war, das #include <string> "gefehlt" hat - string selbst wurde wohl aber über einen anderen include mitgezogen. Beim MSVC wohl nur string, bei gcc und dev++ wohl auch die globale funktion. *Peinlich von mir*
-
Du musst übrigens nicht allen Membervariablen und Funktionen this-> voranstellen, das geht in den meisten Fällen auch ohne.
-
zeusosc schrieb:
@ComputerCarl:
Ok,.. also nach der Konstruktion hast Du aber eine fixe anzahl an Schichten und
Neuronen?Genau! Nach dem Konstruktor sind alle Attribute fest in der Anzahl ihrer Dimensionen.
-
Wenn Dir M[i] Deine Schicht indiziert und M[i][j] Dein Neuron
brauchst Du also "nur" ein zur Initialisierungszeit dynamisches array...Dein Neuron hat welche Parameter?
typedef struct _neuron { double* weight; // gewichte der eingänge LPVOID _ue_func; //zeiger auf eine Gewichtungsfunktion (übertragungsfunktion) LPVOID _outbarrier_func;// Ausgangsschwellenfunktion, also aktivierungsfunktion }
oder sind die Gewichte bei Dir schon mit M[i][j][w] gegeben?
grüße
------
edit:
ahh ok,.. ich sehe es gerade,..
ich bastele mal was