Pages: [1] 2   Go Down
Author Topic: Arduino e le Reti Neurali  (Read 1643 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 16
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ( smiley-fat ) 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

Code:
Connection[] connections={};

che mi restituisce il seguente errore

Code:
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 smiley-wink
Logged

Italy
Offline Offline
Full Member
***
Karma: 6
Posts: 102
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"

Offline Offline
Newbie
*
Karma: 1
Posts: 16
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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++?
Logged

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-lol
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22640
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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)  smiley-razz
Logged


Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Che figura  smiley-sweat
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22640
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Che figura  smiley-sweat
Lascia fare, capita. Pensa a tutte quelle che faccio io....  smiley-sweat smiley-sweat
Logged


Italy
Offline Offline
Full Member
***
Karma: 6
Posts: 102
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"

Offline Offline
Newbie
*
Karma: 1
Posts: 16
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Che il C++ non è completamente supportato me ne sono accorto pian piano  smiley-grin , 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?
Logged

Italy
Offline Offline
Full Member
***
Karma: 6
Posts: 102
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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.
Logged

"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10463
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-mr-green).
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..)
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 1
Posts: 16
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Allora ragazzi, ho pensato che forse sarebbe meglio iniziare a scrivere codice per intenderci meglio e avere qualcosa di concreto  smiley-mr-green
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

Code:
#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?
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10463
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Italy
Offline Offline
Full Member
***
Karma: 6
Posts: 102
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"

Offline Offline
Newbie
*
Karma: 1
Posts: 16
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-roll

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
Logged

Pages: [1] 2   Go Up
Jump to: