Forum: Mikrocontroller und Digitale Elektronik Arduino mit neuronalem Netz überlastet?


von name123 (Gast)


Lesenswert?

Hallo,

ich habe ein Neuronales Netz in Matlab gebaut und daraus C++ Code 
generiert für meinen Arduino Yun. Testweise hab ich erstmal alle 
Funktionen in die Arduino IDE so eingebunden, wie es in der 
Beispieldatei vom Matlab Coder zu finden war, dazu hab ich noch ein paar 
Nachrichten eingebaut, die über die serielle Schnittstelle verschickt 
werden, damit ich sehen kann was der Arduino gerade macht.
Und da ist das Problem, es werden mir die Zahlen bis 3 angezeigt, die 4 
fehlt, außerdem leuchtet die Tx LED auf dem Arduino die ganze zeit (die 
Rx LED blinkt konstant). Ist der Atmega32u4 mit dem neuronalen Netz 
überlastet oder warum kommt er nicht aus der Funtkion in die main 
zurück?

Macht es Sinn den Watchdog mal zu aktivieren? Ich hab gelesen, dass es 
dann evtl. zu Problemen mit dem bootloader kommen kann??

Ich hab jetzt erstmal nur die main und die NeuralNetwork Funktionen 
angehangen, da der Coder jede Menge Funktionen generiert hat, wenn noch 
was fehlt würde ich das dann bei Bedarf noch hochladen.
1
void setup() {
2
  // put your setup code here, to run once:
3
  Serial.begin(19200);
4
5
  //while (!SerialUSB); // wait for Serial port to connect.
6
  while (!Serial) ;
7
  Serial.println("Start:\n");
8
9
  NeuralNetwork_initialize();
10
  Serial.println("1");
11
}
12
13
void loop() {
14
  emxArray_real32_T *data;
15
  float activity_data[2];     
16
  int activity_size[1];
17
  float percent;
18
19
  int i;
20
  Serial.println("2");
21
22
  while(1){
23
  // Initialize function 'NeuralNetwork' input arguments.
24
  // Initialize function input argument 'data'.
25
  data = argInit_d7351x5_real32_T();
26
  Serial.println("3");
27
28
   // Call the entry-point 'NeuralNetwork'.
29
  NeuralNetwork(data, activity_data, activity_size, &percent);
30
  Serial.println("4");
31
  emxDestroyArray_real32_T(data);
32
  Serial.println("5");
33
  delay(20000);
34
  }
35
}
36
37
38
//
39
// MYNEURALNETWORKFUNCTION neural network simulation function.
40
//
41
//  Generated by Neural Network Toolbox function genFunction, 31-May-2016 11:28:21.
42
//
43
//  [y1] = myNeuralNetworkFunction(x1) takes these arguments:
44
//    x = 3xQ matrix, input #1
45
//  and returns:
46
//    y = 3xQ matrix, output #1
47
//  where Q is the number of samples.
48
// Arguments    : const emxArray_real32_T *x1
49
//                emxArray_real32_T *b_y1
50
// Return Type  : void
51
//
52
static void myNeuralNetworkFunction(const emxArray_real32_T *x1,
53
  emxArray_real32_T *b_y1)
54
{
55
  emxArray_real32_T *xp1;
56
  emxArray_real32_T *a1;
57
  emxArray_real32_T *c;
58
  int unnamed_idx_1;
59
  int br;
60
  int cr;
61
  emxArray_real32_T *b_a1;
62
  int ic;
63
  int ar;
64
  int ib;
65
  emxArray_real32_T *b_c;
66
  int ia;
67
  static const float fv0[60] = { -0.935882866F, 4.46991396F, 2.53056645F,
68
    3.92316675F, -0.0743107051F, -0.205709472F, 9.03690338F, -1.70399106F,
69
    0.926421523F, -2.28623581F, 3.10071659F, -1.26935542F, -2.23631501F,
70
    -9.84459591F, 0.993087471F, 2.04302645F, 4.20321703F, -2.27149796F,
71
    3.58496547F, 2.44178247F, 3.40729475F, -0.469613314F, 1.78666961F,
72
    2.29417801F, -3.18740916F, 2.17195415F, -4.67395782F, 7.34630871F,
73
    -3.47461224F, 3.20834136F, -1.70746982F, -5.48665953F, -4.09667301F,
74
    0.739171386F, 1.74923265F, -0.311410457F, -4.78127909F, -1.39544213F,
75
    0.524882078F, 1.18182981F, -0.696411669F, -5.19608736F, 3.62969112F,
76
    2.3355298F, 1.22786868F, -2.47384286F, -3.22555089F, 2.6435349F, 3.88966441F,
77
    5.3713007F, 3.07616806F, 1.22356141F, -1.26548851F, 2.36210823F, 2.64689827F,
78
    3.01882696F, -4.02463341F, -2.71989417F, -0.96769774F, -2.5208497F };
79
80
  emxArray_real32_T *b_xp1;
81
  static const float fv1[60] = { 1.67931402F, 0.225867584F, -0.620378792F,
82
    3.7200551F, -4.08313942F, -1.29023838F, -2.4495995F, 0.483594865F,
83
    0.21202448F, -1.67420352F, 2.72048736F, 0.35660097F, -1.29303122F,
84
    -0.261822969F, 0.836389482F, -0.926075F, 1.18991697F, 0.630103171F,
85
    5.31526899F, 1.27763438F, -5.82296467F, 3.09937382F, 0.774506807F,
86
    -4.02001476F, -1.25317657F, 3.04016709F, -1.59480321F, -1.30187023F,
87
    4.28900337F, -1.87965155F, -1.41545141F, 2.92732859F, -0.156499282F,
88
    3.42386079F, -0.692593813F, -1.06308234F, 1.32546556F, 0.971363962F,
89
    -1.49928606F, 4.62583208F, -0.401979417F, -4.44609356F, 2.21129417F,
90
    -0.263876438F, -1.07116032F, 0.954135299F, -1.38533843F, -1.27242231F,
91
    -3.90341139F, 1.66190958F, 1.72585738F, -1.24888289F, 1.22324169F,
92
    0.0705933943F, 2.23840976F, 0.210101902F, -0.130835086F, 1.03181279F,
93
    -0.514154136F, -1.49132049F };
94
95
  emxInit_real32_T(&xp1, 2);
96
  emxInit_real32_T(&a1, 2);
97
  emxInit_real32_T(&c, 2);
98
99
  //  ===== NEURAL NETWORK CONSTANTS =====
100
  //  Input 1
101
  //  Layer 1
102
  //  Layer 2
103
  //  ===== SIMULATION ========
104
  //  Dimensions
105
  //  samples
106
  //  Input 1
107
  mapminmax_apply(x1, xp1);
108
109
  //  Layer 1
110
  repmat((float)x1->size[1], a1);
111
  unnamed_idx_1 = xp1->size[1];
112
  br = c->size[0] * c->size[1];
113
  c->size[0] = 20;
114
  c->size[1] = unnamed_idx_1;
115
  c->size[0L] = 20;
116
  emxEnsureCapacity((emxArray__common *)c, br, (int)sizeof(float));
117
  unnamed_idx_1 = c->size[1];
118
  for (br = 0; br < unnamed_idx_1; br++) {
119
    for (cr = 0; cr < 20; cr++) {
120
      c->data[cr + c->size[0] * br] = 0.0F;
121
    }
122
  }
123
124
  if (xp1->size[1] == 0) {
125
  } else {
126
    unnamed_idx_1 = 20 * (xp1->size[1] - 1);
127
    for (cr = 0; cr <= unnamed_idx_1; cr += 20) {
128
      for (ic = cr + 1; ic <= cr + 20; ic++) {
129
        c->data[ic - 1] = 0.0F;
130
      }
131
    }
132
133
    br = 0;
134
    for (cr = 0; cr <= unnamed_idx_1; cr += 20) {
135
      ar = -1;
136
      for (ib = br; ib + 1 <= br + 3; ib++) {
137
        if (xp1->data[ib] != 0.0F) {
138
          ia = ar;
139
          for (ic = cr; ic + 1 <= cr + 20; ic++) {
140
            ia++;
141
            c->data[ic] += xp1->data[ib] * fv0[ia];
142
          }
143
        }
144
145
        ar += 20;
146
      }
147
148
      br += 3;
149
    }
150
  }
151
152
  emxInit_real32_T(&b_a1, 2);
153
  br = b_a1->size[0] * b_a1->size[1];
154
  b_a1->size[0] = 20;
155
  b_a1->size[1] = a1->size[1];
156
  emxEnsureCapacity((emxArray__common *)b_a1, br, (int)sizeof(float));
157
  unnamed_idx_1 = a1->size[0] * a1->size[1];
158
  for (br = 0; br < unnamed_idx_1; br++) {
159
    b_a1->data[br] = a1->data[br] + c->data[br];
160
  }
161
162
  emxFree_real32_T(&c);
163
  emxInit_real32_T(&b_c, 2);
164
  tansig_apply(b_a1, a1);
165
166
  //  Layer 2
167
  b_repmat((float)x1->size[1], xp1);
168
  unnamed_idx_1 = a1->size[1];
169
  br = b_c->size[0] * b_c->size[1];
170
  b_c->size[0] = 3;
171
  b_c->size[1] = unnamed_idx_1;
172
  b_c->size[0L] = 3;
173
  emxEnsureCapacity((emxArray__common *)b_c, br, (int)sizeof(float));
174
  unnamed_idx_1 = b_c->size[1];
175
  emxFree_real32_T(&b_a1);
176
  for (br = 0; br < unnamed_idx_1; br++) {
177
    for (cr = 0; cr < 3; cr++) {
178
      b_c->data[cr + b_c->size[0] * br] = 0.0F;
179
    }
180
  }
181
182
  if (a1->size[1] == 0) {
183
  } else {
184
    unnamed_idx_1 = 3 * (a1->size[1] - 1);
185
    for (cr = 0; cr <= unnamed_idx_1; cr += 3) {
186
      for (ic = cr + 1; ic <= cr + 3; ic++) {
187
        b_c->data[ic - 1] = 0.0F;
188
      }
189
    }
190
191
    br = 0;
192
    for (cr = 0; cr <= unnamed_idx_1; cr += 3) {
193
      ar = -1;
194
      for (ib = br; ib + 1 <= br + 20; ib++) {
195
        if (a1->data[ib] != 0.0F) {
196
          ia = ar;
197
          for (ic = cr; ic + 1 <= cr + 3; ic++) {
198
            ia++;
199
            b_c->data[ic] += a1->data[ib] * fv1[ia];
200
          }
201
        }
202
203
        ar += 3;
204
      }
205
206
      br += 20;
207
    }
208
  }
209
210
  emxFree_real32_T(&a1);
211
  emxInit_real32_T(&b_xp1, 2);
212
  br = b_xp1->size[0] * b_xp1->size[1];
213
  b_xp1->size[0] = 3;
214
  b_xp1->size[1] = xp1->size[1];
215
  emxEnsureCapacity((emxArray__common *)b_xp1, br, (int)sizeof(float));
216
  unnamed_idx_1 = xp1->size[0] * xp1->size[1];
217
  for (br = 0; br < unnamed_idx_1; br++) {
218
    b_xp1->data[br] = xp1->data[br] + b_c->data[br];
219
  }
220
221
  emxFree_real32_T(&b_c);
222
  emxFree_real32_T(&xp1);
223
  softmax_apply(b_xp1, b_y1);
224
225
  //  Output 1
226
  emxFree_real32_T(&b_xp1);
227
}

von Jim M. (turboj)


Lesenswert?

Wieso willst das auf dem arschlahmen Atmel rechnen und nicht auf dem 
Linux Prozessor? RAM wird da auch knapp.

Der AR9331 ist wenigstens eine Größenordnung schneller...

von Noch einer (Gast)


Lesenswert?

float Variablen auf einem Atmega? Auf den 8bit Mikrocontrollen machen 
wir alle Arten vor unsauberen Tricks, bevor wir Gleitkommazahlen 
benutzen.

Die haben keine Hardware für Gleitkomma. Jede Berechnung braucht 
hunderte von Maschinenbefehlen.

von Bernd K. (prof7bit)


Lesenswert?

Jim M. schrieb:
> Wieso willst das auf dem arschlahmen Atmel rechnen

Du weißt doch gar nicht wie schnell es sein soll? Vielleicht reichen ihm 
ja ein paar hundert Ergebnisse pro Sekunde vollkommen aus?

> und nicht auf
> dem
> Linux Prozessor?

Kanonen -> Spatzen?

> RAM wird da auch knapp.

Wie das? Wo soll ein fertig trainiertes NN mit ein paar dutzend 
Koeffizienten im Flash irgendwelches nennenswerte RAM verbrauchen?

: Bearbeitet durch User
von Kabolt (Gast)


Lesenswert?

Wieviel Flash / RAM belegst du laut Ausgabe des Makes?

Diese Funktion solltest du noch posten: NeuralNetwork.

von name123 (Gast)


Lesenswert?

Bernd K. schrieb:
> Jim M. schrieb:
>> Wieso willst das auf dem arschlahmen Atmel rechnen
>
> Du weißt doch gar nicht wie schnell es sein soll? Vielleicht reichen ihm
> ja ein paar hundert Ergebnisse pro Sekunde vollkommen aus?


Die Funktion soll ca. 20 mal pro sekunde aufgerufen werden, ist das 
machbar für dem Atmega oder lohnt es sich wirklich den linux prozessor 
zu verwenden?

Kabolt schrieb:
> Wieviel Flash / RAM belegst du laut Ausgabe des Makes?

Der Sketch verwendet 17.168 Bytes (59%) des Programmspeicherplatzes. Das 
Maximum sind 28.672 Bytes.
Globale Variablen verwenden 819 Bytes (31%) des dynamischen Speichers, 
1.741 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.560 
Bytes.

Kabolt schrieb:
> Diese Funktion solltest du noch posten: NeuralNetwork.
1
// daten enthält die x,y,z Beschleudnigung und die richtig aktivität die
2
// erkannt werden soll, zurückgegeben wird die erkannte aktivität und die
3
// relative Genauigkeit des NN
4
//    data: 1.Spalte -> Zeitstempel; 2.-4. Spalte -> x,y,z-Beschleunigung; 5.
5
//    Spalte -> Aktivität
6
// Arguments    : const emxArray_real32_T *data
7
//                float activity_data[]
8
//                int activity_size[1]
9
//                float *percent
10
// Return Type  : void
11
//
12
void NeuralNetwork(const emxArray_real32_T *data, float activity_data[], int
13
                   activity_size[1], float *percent)
14
{
15
  emxArray_real32_T *b_data;
16
  int ix;
17
  int k;
18
  emxArray_real32_T *NNfit;
19
  int ixstart;
20
  emxArray_real32_T *r0;
21
  int n;
22
  int i;
23
  float mtmp;
24
  boolean_T s_data[7351];
25
  boolean_T exitg1;
26
  emxInit_real32_T(&b_data, 2);
27
  ix = data->size[0];
28
  k = b_data->size[0] * b_data->size[1];
29
  b_data->size[0L] = 3;
30
  b_data->size[1L] = ix;
31
  emxEnsureCapacity((emxArray__common *)b_data, k, (int)sizeof(float));
32
  for (k = 0; k < ix; k++) {
33
    for (ixstart = 0; ixstart < 3; ixstart++) {
34
      b_data->data[ixstart + b_data->size[0] * k] = data->data[k + data->size[0]
35
        * (1 + ixstart)];
36
    }
37
  }
38
39
  emxInit_real32_T(&NNfit, 2);
40
  emxInit_real32_T(&r0, 2);
41
  myNeuralNetworkFunction(b_data, r0);
42
  k = NNfit->size[0] * NNfit->size[1];
43
  NNfit->size[0L] = r0->size[1L];
44
  NNfit->size[1L] = 3;
45
  emxEnsureCapacity((emxArray__common *)NNfit, k, (int)sizeof(float));
46
  emxFree_real32_T(&b_data);
47
  for (k = 0; k < 3; k++) {
48
    ix = r0->size[1L];
49
    for (ixstart = 0; ixstart < ix; ixstart++) {
50
      NNfit->data[ixstart + NNfit->size[0] * k] = r0->data[k + r0->size[0] *
51
        ixstart];
52
    }
53
  }
54
55
  emxFree_real32_T(&r0);
56
  ixstart = NNfit->size[0];
57
  if (ixstart >= 3) {
58
  } else {
59
    ixstart = 3;
60
  }
61
62
  if (NNfit->size[0] == 0) {
63
    n = 0;
64
  } else {
65
    n = ixstart;
66
  }
67
68
  activity_size[0L] = n;
69
  for (k = 0; k < n; k++) {
70
    activity_data[k] = 0.0F;
71
  }
72
73
  for (i = 0; i < n; i++) {
74
    ixstart = 1;
75
    mtmp = NNfit->data[i];
76
    k = 1;
77
    if (rtIsNaNF(NNfit->data[i])) {
78
      ix = 2;
79
      exitg1 = false;
80
      while ((!exitg1) && (ix < 4)) {
81
        ixstart = ix;
82
        if (!rtIsNaNF(NNfit->data[i + NNfit->size[0] * (ix - 1)])) {
83
          mtmp = NNfit->data[i + NNfit->size[0] * (ix - 1)];
84
          k = ix;
85
          exitg1 = true;
86
        } else {
87
          ix++;
88
        }
89
      }
90
    }
91
92
    if (ixstart < 3) {
93
      while (ixstart + 1 < 4) {
94
        if (NNfit->data[i + NNfit->size[0] * ixstart] > mtmp) {
95
          mtmp = NNfit->data[i + NNfit->size[0] * ixstart];
96
          k = ixstart + 1;
97
        }
98
99
        ixstart++;
100
      }
101
    }
102
103
    activity_data[i] = k;
104
  }
105
106
  emxFree_real32_T(&NNfit);
107
  ix = data->size[0];
108
  for (k = 0; k < ix; k++) {
109
    s_data[k] = (data->data[k + (data->size[0] << 2)] == activity_data[k]);
110
  }
111
112
  ixstart = 0;
113
  for (k = 0; k < ix; k++) {
114
    if (s_data[k]) {
115
      ixstart++;
116
    }
117
  }
118
119
  *percent = (float)ixstart / (float)n * 100.0F;
120
}

von The D. (thedaz)


Lesenswert?

Hast du diese Code-Wüste selbst geschrieben oder generieren lassen? Im 
Ernst: sowas kann man nicht inhaltlich bewerten. Deswegen alternativ: 
kompiliere das mal auf dem PC und starte es im Debugger.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

name123 schrieb:
> Macht es Sinn den Watchdog mal zu aktivieren?
Sicher nicht, denn wenn du ihn nicht zurücksetzt, dann setzt er 
deinen uC dauernd zurück...

> Globale Variablen verwenden 819 Bytes (31%) des dynamischen Speichers,
Du meinst vermutlich das oridinäre RAM.
> 1.741 Bytes für lokale Variablen verbleiben.
Ich weiß nicht so recht...
Allein das hier:
> boolean_T s_data[7351];
7351 Bits sind allein schon 918 Bytes. Und wehe, der Compiler verwendet 
für ein Boolean ein ganzes Byte...
Und dann kommt noch die wirkliche dynamische Speicherverwaltung über 
"emxEnsureCapacity()" dazu. Und das kann der Compiler tatsächlich nicht 
vorausberechnen, weil es erst zur Laufzeit passiert.

Wenn ich mir das so ansehe, dann fällt mir nur das linke Bild dazu ein.

: Bearbeitet durch Moderator
von name123 (Gast)


Lesenswert?

The D. schrieb:
> Hast du diese Code-Wüste selbst geschrieben oder generieren
> lassen? Im
> Ernst: sowas kann man nicht inhaltlich bewerten. Deswegen alternativ:
> kompiliere das mal auf dem PC und starte es im Debugger.

Der Code wurde aus Matlab Code generiert, deswegen ist es nicht ganze 
einfach diesen nachzuvollziehen. Da der Code aber generiert wurde, würde 
ich erstmal davon ausgehen, dass dieser korrekt funktioniert. Aber kann 
der Arduino so lange dafür brauchen, eine 2x5 Matrix aus float Werten im 
NN zu verarbeiten?

Die Arduino IDE hat leider keinen Debugger, wenn es wirklich sein kann, 
dass der Atmega das nicht schafft dann muss ich mal schauen ob ich die 
ganzen Librarys von Arduino finde und das ganze im Atmel-Studio laufen 
lassen.

Hat schonmal jemand versucht eigenen Code auf dem Linux Prozessor vom 
Yun laufen zu lassen, hab in der Arduino Doku nicht wirklich was dazu 
gefunden, nur das es theoertisch möglich ist?

von name123 (Gast)


Lesenswert?

Lothar M. schrieb:
> name123 schrieb:
>> Macht es Sinn den Watchdog mal zu aktivieren?
> Sicher nicht, denn wenn du ihn nicht zurücksetzt, dann setzt er
> deinen uC dauernd zurück...

Ja wenn er resettet wird, weiß ich das es zu viel für den uC ist oder 
sehe ich das falsch?

Lothar M. schrieb:
>> Globale Variablen verwenden 819 Bytes (31%) des dynamischen Speichers,
> Du meinst vermutlich das oridinäre RAM.
>> 1.741 Bytes für lokale Variablen verbleiben.
> Ich weiß nicht so recht...
> Allein das hier:
>> boolean_T s_data[7351];
> 7351 Bits sind allein schon 918 Bytes. Und wehe, der Compiler verwendet
> für ein Boolean ein ganzes Byte...
> Und dann kommt noch die wirkliche dynamische Speicherverwaltung über
> "emxEnsureCapacity()" dazu. Und das kann der Compiler tatsächlich nicht
> vorausberechnen, weil es erst zur Laufzeit passiert

Das ist das was mir die Arduino IDE nach dem programmieren des uC 
anzeigt.
der Code soll theoretisch bis zu einer Datensatzlänge von 7351 
funktionieren, in static emxArray_real_T *argInit_d7351x5_real_T() wird 
diese zum Testen erstmal auf 2 gesetzt, warum in NeuralNetwork trotzdem 
jedes mal soviel Speicher blockiert wird. Insgesamt braucht der Sketch 
17.200 Bytes, liegen diese komplett im RAM? Laut Datenblatt hat dieser 
nur 16 KB!

von Joachim B. (jar)


Lesenswert?

name123 schrieb:
> Atmega32u4

name123 schrieb:
> Insgesamt braucht der Sketch
> 17.200 Bytes, liegen diese komplett im RAM? Laut Datenblatt hat dieser
> nur 16 KB!

komisch Atmel meint:

SRAM (kBytes): 2.5

http://www.atmel.com/devices/atmega32u4.aspx?tab=parameters

Lothar M. schrieb:
> 7351 Bits sind allein schon 918 Bytes. Und wehe, der Compiler verwendet
> für ein Boolean ein ganzes Byte...

von Michael B. (laberkopp)


Lesenswert?

name123 schrieb:
> Ist der Atmega32u4 mit dem neuronalen Netz überlastet

Im Prinzip ja. Floating-Poinnt ist nichts für den. 3-fach geschachtelte 
Schleifen schon gar nicht. Schon der Stack-Speicher wird nicht reichen. 
Mit dem Programm wird das also nichts.

Es hat schon einen Grund, warum man für neuronale Netze gerne 
spezilisierte Prozessoren verwendet.

von Alexander S. (esko) Benutzerseite


Lesenswert?

Dieser Code ist Schrott, einfach mal den Code unten anschauen.

Man kann dann nur hoffen, dass der GCC-Optimierer einige 
Nachlässigkeiten des Matlab-Code-Generators ausbügelt.

name123 schrieb:
>     if (ixstart < 3) {
>       while (ixstart + 1 < 4) {
>         if (NNfit->data[i + NNfit->size[0] * ixstart] > mtmp) {
>           mtmp = NNfit->data[i + NNfit->size[0] * ixstart];
>           /* dieser Ausruck wird
>           k = ixstart + 1;
>         }
>         ixstart++;
>       }
>     }

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> Arduino mit neuronalem Netz überlastet?
Probier doch mal im Kopf den Tangens der dritten Wurzel von 4883,0815 zu 
berechnen. Dann weißt Du, wie sich der Ardummino gerade fühlt.

von PittyJ (Gast)


Lesenswert?

Anscheinend ist das neuronale Netz vor dem Rechner auch schon 
überlastet.

Es schint es noch was schnelleres dort zu geben, das fähig ist, einen 
Browser zu starten (ein PC?) .
Aber das neuronale Netz soll auf dem langsamsten verfügbaren Rechner 
laufen.


Gestern war so ein Troll da, der ARM Prozessoren suchte und innerhalb 
eines Tages ein Linux portiert hat.

von name123 (Gast)


Lesenswert?

Michael B. schrieb:
> Im Prinzip ja. Floating-Poinnt ist nichts für den. 3-fach geschachtelte
> Schleifen schon gar nicht. Schon der Stack-Speicher wird nicht reichen.
> Mit dem Programm wird das also nichts.
>
> Es hat schon einen Grund, warum man für neuronale Netze gerne
> spezilisierte Prozessoren verwendet.


Danke für die Antwort, dann werde ich mich mal nach geeigneter Hardware 
umsehen.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Da mußt Du mal Dr. Noonien Soong fragen, der hat davon Ahnung.

von Tim  . (cpldcpu)


Lesenswert?

Ist heute schon Freitag?

Würde vorschlagen für das Thema sowohl Matlab als auch Arduino hinter 
sich zu lassen. Die coolen Kids spielen gerade mit Tensorflow und 
GPU-Accelleration.

von Jim M. (turboj)


Lesenswert?

name123 schrieb:
> Die Funktion soll ca. 20 mal pro sekunde aufgerufen werden, ist das
> machbar für dem Atmega oder lohnt es sich wirklich den linux prozessor
> zu verwenden?

Da sind tonnenweise Floats drin, das wird so nix auf dem Atmega - 
außerdem hat der vermutlich auch vielzuwenig RAM.

von ... (Gast)


Lesenswert?

Am einfachsten einen 8087 Numeric Coprocessor an den ATNega
anschliessen. Für den sind die paar Floats und Double nicht
mal ein Räuspern wert.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> ATNega
Wußte gar nicht, daß es den IC auch in weiß gibt... ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.