M
Hallo.
@DocShoe sagte in Statische Memberfunktionen überschreiben:
Nochmal im Ernst, was genau möchtest du erreichen? Was sind Base/Derived konkret, und wie viele verschiedene "Derived" wird's geben?
Konkret soll es die Implementierung eines neuronalen Netzes werden. Mein Basis-Typ ist heißt "Layer" und definiert virtuelle Methoden (forward_propagate, backward_propagate, save_to_file, und alles was man sich so vorstellen kann). Abgeleitet davon gibt es VectorInputLayer (keine zusätzlichen Attribute), FullyConnectedLayer (speichert zusätzlich eine Gewichtsmatrix und einen Biasvektor), ConvolutionalLayer (speichert Kernelmatrix und Biaskonstante), FlatteningLayer (keine zusätzlichen Attribute), ... . Die Methoden der Basisklasse sollen dabei überschrieben werden, die Attribute der abgeleiteten Klassen sind aber sehr unterschiedlich. Die zeros_like-Funktion brauche ich um für jede dieser abgeleiteten Klassen einen Layer des selben Typs zu initialisieren bei denen alle Attribute (Gewichte, Bias, Kernel, ...) mit der passenden Größe, aber mit 0-Werten initialisiert werden. Die Vererbung erlaubt es mir dann im Hauptprogramm alle Layer unabhängig vom Typ durchzugehen und das Netz auszuwerten:
std::vector<std::unique_ptr<Layer>> layers;
// Create Layer list and set weights, biases, activation function...
//...
// Evaluate network
DataArray* data = layers.front()->eval(x);
for(auto layer_it = layers.begin()+1; layer_it != layers.end(); ++layer_it)
(*layer_it)->forward_propagate(*data)
Layer ist im oberen Beispiel Base und Derived1 ist zum Beispiel VectorInputLayer. Irgendwann muss ich mal einen Gradienten anlegen (ist selbst ein neuronales Netz mit gleicher Dimension), aber zunächst mit 0 initialisiert, also:
NeuralNetwork grad;
for(auto layer = net.layers.begin(); layer != net.layers.end(); ++layer)
grad.layers.push_back((*layer)->zeros_like());
Ich habe zeros_like jetzt wie von anderen schon vorgeschlagen als normale Methode implementiert, die virtual in Layer und override in jeder abgeleiteten Klasse ist. Das funktioniert, ist aber nicht unbedingt die schönste Lösung.
@Quiche-Lorraine sagte in Statische Memberfunktionen überschreiben:
Wie wäre es mit Templates ?
Danke für den Hinweis. Leider werden Templates bei mir nicht funktionieren, da die Klassen, für die ich zero_like brauche doch zu unterschiedlich sind und auch keinen Konstruktor mit gleicher Signatur haben.
Ich danke allen nochmal für die Hilfe, ich denke ich habe jetzt die Lösung, die irgendwie funktioniert.
Viele Grüße.