Wieso funktioniert ArrayFill nicht in diesem fall?

Einloggen oder registrieren, um einen Kommentar zu schreiben
Bayne
745
Bayne  
input int Layers = 4              // amount of Layers the NN should consist of
input int Neuronen_L1 = 10;       // amount of neurons the first layer should consist of

double NeuronenArray[];           // here the amount of Neurons for a layer should be stored e.g. NeuronenArray[0] = Neuronen_L1 = 10 (10 neurons in the first layer) ...     NeuronenArray[1] = Neuronen_L2 = 10 (X neurons in the first layer)  
ArrayResize(NeuronenArray,Layers); 

double weight_L1[],weight_L2[],weight_L3[],weight_L4[],weight_L5[];

for (int i=0;i<Layers;i++)
   {                                                   //--- place weights into the array
   if (i+1 == 1){NeuronenArray[i] = Neuronen_L1;   ArrayResize(weight_L1,NeuronenArray[0]);     Print(weight_L1[0]);Print(weight_L1[1]);Print(weight_L1[2]);Print(weight_L1[3]);Print(weight_L1[4]);}   // print-> so that you can see   
   }
for (int i=0;i<Layers;i++)
      { 
      if (i+1 == 1)
      {ArrayFill(weight_L1,0,NeuronenArray[i]-1,0.5);       Print(weight_L1[0]);Print(weight_L1[1]);Print(weight_L1[2]);Print(weight_L1[3]);Print(weight_L1[4]);} // print-> so that you can see     
      }

Hey, ich möchte eine neuronale Netzwerkstruktur mit dem obigen Code erstellen.

Das Problem: Wenn ich versuche, die Gewichte einer Ebene zu füllen, ändert sich durch FillArray () nichts (zur Vereinfachung habe ich nur den Code für die erste Ebene gezeigt).

 

 

 

Haben Sie eine Idee, warum und was getan werden könnte?

 

Die Ausgabe ist immer wie folgt: (Die ersten beiden Ebenen mit einer seltsamen Nummer und den restlichen Nullen, aber tatsächlich hat sich nichts geändert, seit der erste Lopp das Gleiche gedruckt hat.)


2019.06.15 15:15:03.677 2014.01.01 00:00:00   9.881312916824931e-324
2019.06.15 15:15:03.677 2014.01.01 00:00:00   9.881312916824931e-324
2019.06.15 15:15:03.677 2014.01.01 00:00:00   0.0
2019.06.15 15:15:03.677 2014.01.01 00:00:00   0.0
2019.06.15 15:15:03.677 2014.01.01 00:00:00   0.0
Carl Schreiber
Moderator
8152
Carl Schreiber  

Druck mal alle(!) relevanten Werte aus, also auch Layers, i, NeuronenArray[i]-1.

Allerdings würde ich genau so etwas mit dem Debugger machen und oben als ersten Wert _LastError eintragen

Bayne
745
Bayne  
Carl Schreiber:

Druck mal alle(!) relevanten Werte aus, also auch Layers, i, NeuronenArray[i]-1.

Allerdings würde ich genau so etwas mit dem Debugger machen und oben als ersten Wert _LastError eintragen

Alles so wie es sein sollte (ausser das bereits nach ArrayResize() exponentielle zahlen vorliegen, ist aber normal soweit ich weiß). Debugger hatte auch keinen neuen Hinweis geliefert, also hatte ich euch die Print()s mit angegeben. GetLastError() ebenfalls 0.

Bayne
745
Bayne  

wenn ich das NeuronenArray[i] entferne und stattdessen 10 eintippe funktioniert FillArray() (Arrays werden als input scheinbar nicht akzeptiert). Aber so kann ich doch unmöglich ein NN mit Inputs betreiben.

Hast du eine Idee Carl?


Edit: habe das Problem durch stupides Zwischensetzen eines neuen Elements gelöst:
int Neuronen = NeuronenArray[i];

Verbesserungsvorschlag ist dennoch wilkommen :)


Hier die fertige Lösung für künftige Gernerationen mit ähnlichem Problem:

input int Layers = 4              // amount of Layers the NN should consist of
input int Neuronen_L1 = 10;       // amount of neurons the first layer should consist of

double NeuronenArray[];           // here the amount of Neurons for a layer should be stored e.g. NeuronenArray[0] = Neuronen_L1 = 10 (10 neurons in the first layer) ...     NeuronenArray[1] = Neuronen_L2 = 10 (X neurons in the first layer)  
ArrayResize(NeuronenArray,Layers); 

double weight_L1[],weight_L2[],weight_L3[],weight_L4[],weight_L5[];

for (int i=0;i<Layers;i++)
   {                                                   //--- place weights into the array
   if (i+1 == 1){NeuronenArray[i] = Neuronen_L1;   ArrayResize(weight_L1,NeuronenArray[0]);     Print(weight_L1[0]);Print(weight_L1[1]);Print(weight_L1[2]);Print(weight_L1[3]);Print(weight_L1[4]);}   // print-> so that you can see   
   }
for (int i=0;i<Layers;i++)
      { 
      if (i+1 == 1)
      {int Neuronen = NeuronenArray[i];
        ArrayFill(weight_L1,0,NeuronenArray[i]-1,0.5);       Print(weight_L1[0]);Print(weight_L1[1]);Print(weight_L1[2]);Print(weight_L1[3]);Print(weight_L1[4]);} // print-> so that you can see     
      }
Einloggen oder registrieren, um einen Kommentar zu schreiben