Arduino e le Reti Neurali

Salve a tutti, eccomi qua con il mio primo post.

Vi scrivo per chiedervi aiuto, o almeno avere delle indicazioni, su come realizzare una libreria per gestire le Reti Neurali. Anche se non conoscete l'argomento potete aiutarmi lo stesso, dato che non entrerò nel dettaglio.

Ho trovato qualcosa in proposito in giro per la rete, in particolar modo una classe scritta in Processing (questa la fonte), che se non vado errato è da dove deriva il Wiring, il linguaggio usato da Arduino.

Ovviamente ( :drooling_face: ) un semplice copia/incolla del codice non è bastato, in quanto ci sono alcune diversità tra i due linguaggi. Quello da cui vorrei partire, ovvero il primo errore ricevuto, è questo

Connection[] connections={};

che mi restituisce il seguente errore

error: expected unqualified-id before '[' token

Connection è il nome di una classe con annesso costruttore. Il problema, mi pare di aver capto, è che il Wiring ha bisogno della dimensione dell'array tra parentesi [], ma volendo crearlo in modo dinamico vorrei sapere come fare.

Grazie mille per le eventuali, spero numerose, risposte, se avete bisogno di altri chiarimenti non esitate a farmi domande :wink:

In C lo farei con puntatori e liste, l'array dinamico intendo.
N.

superp:
In C lo farei con puntatori e liste, l'array dinamico intendo.
N.

Mi sconsigli quindi di usare le classi ed avere un approcio più da C che non C++?

Potresti spiegarmi meglio cosa fa quella classe in processing? No perchè sarebbe il mio sogno ricevere input dal mio sistema nervoso, anche se sono abbastanza scettico XD

Ma una rete neurale non è un sistema per interlacciare un dispositivo al cervello ma un algoritmo in grado di cambiare il suo stato interno durante l'esecuzione in base alle informazioni che riceve dal mondo esterno (autoapprendimento) :stuck_out_tongue:

Che figura :sweat_smile:

sciorty:
Che figura :sweat_smile:

Lascia fare, capita. Pensa a tutte quelle che faccio io.... :sweat_smile: :sweat_smile:

pk86:

superp:
In C lo farei con puntatori e liste, l'array dinamico intendo.
N.

Mi sconsigli quindi di usare le classi ed avere un approcio più da C che non C++?

Guarda per quanto ne so io, ma gli utenti più esperti ne sapranno di più, non tutto il C++ è supportato.
In C io creerei una struct con i campi che ti servono e un campo puntatore alla prossima connessione. Considera che è solo uno spunto per una discussione/studio...non faccio cose complesse in C da non so quanto tempo. Utenti navigati che ne dite?
N.

Che il C++ non è completamente supportato me ne sono accorto pian piano :smiley: , altrimenti sarebbe stato uno spasso usare le libreria create per il C++, e se ne trovano molte in giro.
TI ringrazio per il consiglio della struct, ed ovviamente è ciò che avevo pensato fin da subito. La mia domanda è se è un tipo di dato efficiente (sia come peso che come velocità) o si può fare di meglio?

TI ringrazio per il consiglio della struct, ed ovviamente è ciò che avevo pensato fin da subito. La mia domanda è se è un tipo di dato efficiente (sia come peso che come velocità) o si può fare di meglio

Come peso , credo che intendi occupazione di memoria, dipende dal tipo di dato che metti dentro. Come velocitá, che intendi? Velocitá di accesso ai dati? Non credo che in C puoi trovare di meglio dei puntatori, almeno per tipi dinaminici. Sinceramente, non conosco alti metodi per "fare di meglio", ma magari qualche guru si.
N.

easy, la struttura è il metodo migliore per tipi di dato "complessi".

non c'è un grosso overhead del codice a parte un pò di magia coi puntatori nascosta, se è questo che intendi, ma non dovrebbe essere molto diversa da quella degli array salvo che al posto dell'indice c'è la variabile da accedere (l'array è la struttura), e la matematica per la cella di memoria non è una moltiplicazione dell'indice per l'elemento ma un valore fisso in base al tipo di dato scelto.
O almeno, a caldo io farei così, poi l'implementazione vera chissà qual è.

come velocità di accesso ai dati i puntatori non sono il meglio: devi leggere l'area di memoria del puntatore, usare il valore per leggere quell'area di memoria, ed infine leggi il dato.
con una variabile hai direttamente l'area di memoria da leggere (salti un salto :grin:).
per quanto riguarda la velocità di esecuzione, la cosa ideale è usare tipi di dato della stessa grandezza dell'architettura (8bit caso arduino, di meno sprechi CPU, di più ti serve più tempo CPU), ed idealmente avere un processo o thread per ogni core (1 nel nostro caso, quindi eliminare gli interrupt grazie..)

Allora ragazzi, ho pensato che forse sarebbe meglio iniziare a scrivere codice per intenderci meglio e avere qualcosa di concreto :grin:
Ammettiamo che la libreria si chiami NeuralNet, di seguito questo dovrebbe essere il file NeuralNet.h per avere la struttura di base di una rete

#ifndef NeuralNet_h
#define NeuralNet_h

struct Neuron {
	float input, output;
	float error, delta;
};

class NeuralNet {
public:
       InputLayer(int neuron_number);
       void setInput(float* input_vector);

       Layer(Layer* il, int neuron_number, float lr = 0.3, float InitialWeightMax = 1.0);
       
       OutputLayer(Layer* il, int neuron_number, float lr = 0.3, float InitialWeightMax = 1.0);
	   void setTarget(float* target_output_vector);
	   void getOutput(float* output_vector);
	   float getError();  
};
#endif

Che ne dte? E' un buon punto di partenza?

perchè una classe? tra l'altro credo che tu stia facendo casini con i costruttori perchè non specifichi il valore di ritorno delle funzioni

Hello again pk86,
capisco che sei molto orientato al c++, ma in c puoi fare il tutto senza tirare in mezzo le classi. Ti posto in link con una infarinata sulle liste, magari ti torna utile
http://www.myglider.altervista.org/tutorial/liste_dinamiche.php
N.

lesto:
perchè una classe? tra l'altro credo che tu stia facendo casini con i costruttori perchè non specifichi il valore di ritorno delle funzioni

si infatti credo di aver fatto un copia/incolla sbagliato del codice, non so da dove è uscito :roll_eyes:

superp:
Hello again pk86,
capisco che sei molto orientato al c++, ma in c puoi fare il tutto senza tirare in mezzo le classi. Ti posto in link con una infarinata sulle liste

Il fatto è che vedo tutte le librerie sviluppate con le classi, e volendo creare qualcosa "per tutti" mi verrebbe più spontaneo.
Tra l'altro non saprei se arduino accetta le librerie fatte tramite funzione, dovrei provare.
Grazie mille per il link e per i consigli che stanno arrivando

Due domande:

  • Una volta fatta la libreria che tipo di applicazioni pensavi che si possono fare?
  • Io vorrei imparare qualcosa di reti neurali, per caso tu sai indicarmi qualche manuale, tutorial o similare che sia comprensibile per capire il concetto e gli algoritmi base?