In questo articolo impareremo come integrare una rete neurale nel SBC. Creeremo una rete neurale a 3 strati per approssimare la funzione sin(x).
Il processo è diviso in due parti: 1. formazione della rete, che verrà eseguita sul PC e; 2. esecuzione della rete, che verrà eseguita nell'SBC.
Parte 1. Formazione sulle reti neurali
Per questa parte utilizzeremo i notebook Jupyter, con le librerie Keras, Numpy e Pylab.
Passo 1. Importa le librerie necessarie

Passaggio 2. Creare il set di dati di addestramento
Il nostro set di dati è composto da 10000 numeri casuali nell'intervallo 0 – 2*pi come input X e la funzione sin corrispondente come input Y. Si noti che abbiamo regolato l'intervallo di Y in modo che vada da 0 a 1.

Passaggio 3. Creare la rete neurale
Per creare la rete neurale, creiamo un oggetto modello e vi aggiungiamo 3 livelli. Questo viene fatto tramite l'API fornita dalla libreria Keras.
Il numero di neuroni sarà 32 per il primo strato, 32 per lo strato intermedio e 1 per l'uscita.
Useremo le attivazioni relu e sigmoid.
L'ottimizzatore utilizzato è Adam e la funzione di errore MSE.
Il numero di parametri di rete è 1153.

Passaggio 4. Formazione
Durante l'addestramento, la rete neurale utilizza il set di dati per regolare i suoi parametri in modo tale da ridurre al minimo l'errore.
In questo caso, abbiamo passato l'intero set di dati attraverso la rete 10 volte, in batch di 32 campioni.
Come possiamo vedere, alla fine dell'allenamento, l'errore è molto piccolo, 2.5e-5.

Passaggio 5. Verifica
Ora testeremo la rete neurale un'ultima volta e la confronteremo con i valori previsti. Come si vede nel grafico, la rete approssima abbastanza bene la funzione seno.

Passo 6. Esporta i dati
Questa funzione permette di esportare i pesi della rete neurale in un file di testo per poi caricarlo dall'SBC.

Parte 2. Esecuzione su SBC
Prima di tutto, esamineremo l'implementazione della rete neurale.
La rete neurale è divisa in 4 classi: Neural_Network, Layer, Perceptron e Activation.
Ogni classe ha fondamentalmente 1 metodo chiamato processo che è incaricato di fare tutto il lavoro, oltre a metodi di caricamento e salvataggio.
Attivazione class, implementa le funzioni di attivazione lineare, relu, sigmoid e tanh.

percettrone class è responsabile dell'esecuzione di tutte le moltiplicazioni. Si noti che la funzione di moltiplicazione vettoriale è implementata in ASM per non sacrificare le prestazioni.


Implementazione ASM vs Python
La moltiplicazione vettoriale è responsabile della maggior parte dell'utilizzo della CPU, quindi implementarla su ASM consente di migliorare di molto le prestazioni della libreria. In questo esempio, viene eseguita una semplice moltiplicazione vettoriale 100×100. Un'implementazione di Python richiede 1339 us, mentre l'implementazione di ASM richiede solo 28 us. Questo è circa 50 volte più veloce pur conservando gli stessi valori di output.

Strato la classe raggruppa alcuni percettroni in parallelo.

La classe Rete neurale impila tutti i livelli di rete.

Infine, possiamo rivedere/verificare l'utilizzo della rete.
Copiamo il file con i pesi nell'SBC ed eseguiamo il seguente main.py.
Questo codice carica la rete dal file sine.unn e calcola il seno di 0.123 e quindi visualizza il valore ottenuto dalla rete e il seno reale, oltre al tempo di calcolo in microsecondi.

Uscita:

Come si vede, l'output approssima il valore atteso con 4 decimali.
Questa rete, con 1153 pesi, richiedeva 4612 (1153*4) byte di RAM per memorizzare i pesi nel valore float e 5.8 ms per l'elaborazione.