Come si può scrivere una funzione di attivazione in una rete neurale per gestire un'architettura a strati di dimensioni arbitrarie?

3

Sto creando una rete neurale in Clojure che può prendere una serie di numeri interi e restituire una struttura dati che rappresenta gli strati di una rete neurale: così (make-layers [1 4 5]) valuterà in:

[[0]          <-- input
 [0 0 0 0]    <-- hidden
 [0 0 0 0 0]] <-- output 

Quando eseguo la mia funzione di attivazione sui pesi della rete, tuttavia, ottengo un errore di core.matrix che dice che non è possibile eseguire la moltiplicazione della matrice su un input di un vettore unidimensionale con la trasposizione dei pesi :

(core.matrix.operators/* inputs (transpose weights))
 user=> Incompatible shapes, cannot broadcast [1] to [4 2]

Capisco perché questo non funzioni dal punto di vista della moltiplicazione delle matrici, ma non sono sicuro di come riscrivere la funzione per gestire strati di lunghezza arbitraria.

Ecco un esempio che mostra a cosa sto lavorando: link

    
posta kurofune 11.08.2015 - 02:59
fonte

1 risposta

1

Sembra che tu stia utilizzando * (moltiplicazione degli elementi elementari) quando vuoi veramente utilizzare mmul (moltiplicazione di matrice).

Se stai calcolando un layer nascosto di lunghezza 4 da un vettore di input di lunghezza 1, la tua matrice di peso dovrebbe essere una matrice 4x1, ad esempio:

(def weights [[1.0] [2.0] [3.0] [4.0]]) ;; a 4x1 weight matrix
(def input [1.5])
(mmul weights input)
=> [1.5 3.0 4.5 6.0]

Spero che ti aiuti!

    
risposta data 14.08.2015 - 08:20
fonte