• Non ci sono risultati.

4.2 Realizzazione

4.2.2 Modulo EchoStateNetwork

4.2.2.4 Classe ESN

Una volta create le classi relative agli strati, la classe ESN viene istanziata indicando al costruttore tali istanze, che le memorizza come attributi della classe. La seguente Tabella 4.10 elenca gli attributi della classe ESN.

Nome Tipo input Input reservoir Reservoir readout Readout hasInputLayer Boolean tiny Boolean gpu Boolean

Tabella 4.10: Attributi della classe ESN

La classe ESN contiene, oltre al costruttore, i metodi per i calcoli svolti dalla ESN, elencati e descritti in Sezione 4.1.5. La seguente Tabella 4.11 contiene tutti i metodi forniti dalla classe ESN.

Nome Parametri Output

ESN fresh, R, O, I=None, gpu id=-1 None

updatestate inputVector,

fedBackOutputVector statevector compute reservoirState outputvector

compute reservoir states inputSignal, targetOutputSignal, transient=0

X,

Ytarget no tran predict output sequence states Y

compute mapped states inputSequence,

state mapping function=‘root’ X

state mapping X, mapping type mapped state

load path, gpu id=-1 None

save path None

move to GPU None None

move to CPU None None

Il parametro fresh, indicato al costruttore, consente di determinare se caricare la ESN da un file, oppure crearne una nuova utilizzando i parametri relativi ai tre strati, ovvero R, O e I rispettivamente per le istanze della classe Reservoir, Readout e Input. Nel primo caso richiama il metodo load, il quale carica la ESN da un file di testo o binario, e avvalora gli attributi input, reservoir e readout di ESN. Nel secondo caso invece i tre attributi appena menzionati sono avvalorati con i parametri I, R e O. In particolare, per gestire l’assenza dello strato di input nella ESN, il parametro I ha come valore di default la costante built-in None. Il metodo save scrive su un file di testo o un file binario lo stato della ESN. Per il caricamento e il salvataggio da/su file binario `e stata utilizzato il modulo pickle di Python.

Il metodo updatestate acquisisce l’input inputVector (assegnandolo all’attributo inputvector di input) e aggiorna lo stato del reservoir (l’attributo stateVector di reservoir) utilizzando inputVector e/o fedBackOutputVector; per sapere quale dei due utilizzare si usano i seguenti attributi riguardanti l’architettura della ESN creata: • hasInputLayer: vale True se l’oggetto di tipo Input `e stato passato al costruttore; • readout.hasFeedBack: vale True se il parametro relativo allo scaling dei pesi di feedback ha valore strettamente positivo (in modo che sia stata costruita la matrice Wfdb di tali pesi).

Per le ipotesi fatte in fase di analisi, si assume che almeno uno dei due attributi abbia valore True; di conseguenza sono possibili tre casi a seconda che entrambi valgono True, oppure uno dei due vale True. In ciascuno di questi casi cambia la formula per l’ag- giornamento dello stato, coinvolgendo rispettivamente entrambi i vettori inputVector e feedBackOutputVector, oppure uno dei due. Tale metodo coinvolge anche gli attri- buti gain e bias di reservoir, che, in una fase preliminare, sono stati eventualmente aggiornati dall’algoritmo IP. Infine gestendo l’attributo isAugmented di reservoir, si determina se utilizzare la matrice Wphi e la funzione di attivazione phif per aggiornare l’attributo phix di reservoir; in tal caso il metodo updatestate restituir`a il vettore phix.

Il metodo compute, utilizzando la funzione readout.f, calcola l’output della ESN ag- giornando dunque l’attributo outputvector di readout. La funzione readout.f `e applicata sul vettore risultante dal prodotto tra la matrice readout.Wout e un vettore, memorizzato nell’attributo concatenation vector for output di readout; come in- dica il nome, tale vettore `e il risultato di una concatenazione tra uno o pi`u dei seguenti vettori:

• il vettore restituito dal metodo updatestate (reservoir.statevector oppure reservoir.augmentedstatevector in caso di ϕ-ESN);

• readout.biasValue.

Il vettore restituito da updatestate `e sempre presente; se

readout.hasDirectInputToOutput vale True si concatena all’inizio il vettore

input.inputvector; infine se readout.biasValue > 0 si concatena come ultimo ele- mento anche tale valore. La matrice readout.Wout avr`a un numero di colonne uguale alla lunghezza di tale vettore, ed `e stato quantificato definendo Nx0 in Sezione 4.1.1.

Infine la funzione readout.f restituir`a il vettore finale outputvector di readout. Il metodo computeReservoirStates calcola la matrice degli stati X iterando l’applica- zione del metodo updateState. Ogni colonna di X `e costruita tramite la stessa conca- tenazione fatta nel metodo compute. Il numero di colonne di X `e in funzione del valore di transient, in quanto le prime transient iterazioni della funzione updateState non inseriscono gli stati risultanti in X. Tale metodo elimina anche i primi transient output target dalla matrice targetOutputSignal passata.

Il metodo predict output sequence, data una matrice di stati, applica iterativamente il metodo compute, per costruire una matrice di output Y.

Il metodo compute mapped states itera l’applicazione del metodo

compute reservoir states su ogni segnale di input presente nella lista inputSequence; su ciascuna matrice Xp ottenuta si calcola lo state mapping tramite il metodo

state mapping. Gli stati risultanti sono aggiunti colonna per colonna nella matrice finale X.

Il costruttore di ciascuna delle classi relative ai tre strati della ESN, prende in input anche il flag tiny; se esso `e True, le matrici e gli array, nonch´e le funzioni di attivazione, devono rispettare le regole stabilite per una Tiny ESN.

Infine i metodi move to GPU e move to CPU trasferiscono rispettivamente nella memoria della GPU e della CPU tutti gli array e le funzioni memorizzati nella classe ESN.