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 ( ) 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
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)
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 , 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 ).
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
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
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
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
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?