Come posso fare in modo che la mia rete gestisca equamente le rotazioni dell'input?


11

Sto tentando di programmare il mio sistema per eseguire una rete neurale. Per ridurre il numero di nodi necessari, è stato suggerito di fare in modo che le rotazioni dell'input fossero trattate allo stesso modo.

La mia rete mira a imparare e prevedere il gioco della vita di Conway osservando ogni quadrato e i suoi quadrati circostanti in una griglia e fornendo l'output per quel quadrato. Il suo input è una stringa di 9 bit:

aliante

Quanto sopra è rappresentato come 010 001 111.

Esistono altre tre rotazioni di questa forma e tutte producono lo stesso output:

Rotazioni dell'aliante

La mia topologia di rete è composta da 9 nodi di input e 1 nodo di output per lo stato successivo del quadrato centrale nell'input. Come posso costruire i layer nascosti in modo che prendano ciascuna di queste rotazioni allo stesso modo, riducendo il numero di input possibili fino a un quarto dell'originale?

Modificare:

C'è anche una rotazione di ogni rotazione che produce un risultato identico. Incorporare questi taglierà i miei input di 1/8. Con l'aliante, il mio obiettivo è che tutti questi input vengano trattati esattamente allo stesso modo. Questo dovrà essere fatto con la pre-elaborazione o posso incorporarlo nella rete?


Domanda eccezionale! Ho un problema simile e di impedimento con il mio progetto e sarò molto interessato a conoscere le tecniche più efficienti per ridurre la simmetria.
DukeZhou

@DukeZhou Ho comunque l'impressione che ci vorrà del tempo per ottenere una risposta. Sono pronto a esaurire la mia scarsa scorta di rappresentanti per organizzare una taglia se necessario ...
Aric,

Un'altra soluzione è pre-elaborare l'input, in modo tale che tutte e 4 le rotazioni vengano convertite nella stessa immagine prima di essere immesse in rete.
BlueMoon93,

Risposte:


4

Se capisco bene il tuo singolo nodo di output sarà il prossimo stato del quadrato nel mezzo. Non devi preoccuparti del numero di nodi nei livelli nascosti mentre hai risorse sufficienti per addestrare il modello. Questo problema è molto facile da imparare per una rete neurale, quindi non ci sono problemi di dimensioni.

È necessario eseguire una formazione supervisionata, il che significa che è necessario inserire i dati di input e l'output previsto corrispondente. Devi essere sicuro che nei tuoi dati di allenamento tutte e 4 le rotazioni siano assegnate allo stesso output. In questo modo la tua rete dovrebbe imparare a trattare tutti questi allo stesso modo.

Mi hai incuriosito, quindi ho provato me stesso. La mia soluzione potrebbe essere corretta al 100% in circa 20 epoche in pochi secondi sul mio vecchio laptop. Ho modificato leggermente l'output in modo che sia categorico [0,1] o [1,0], ma questo dà lo stesso risultato che stai cercando. Solo per riferimento qui è il codice scritto in Python:

from keras.models import Sequential
from keras.layers import Input, Dense
from keras.models import Model
from keras import optimizers
from keras.utils.np_utils import to_categorical
import helper

x_,y_ = helper.fnn_csv_toXY("conway.csv","output",False)
y_binary = to_categorical(y_)

model = Sequential()
model.add(Dense(100, activation='relu', kernel_initializer='glorot_uniform',input_shape =(9,)))
model.add(Dense(20, activation='relu', kernel_initializer='glorot_uniform'))
model.add(Dense(2, activation='softmax'))
adam=optimizers.Adam()
model.compile(optimizer=adam,
              loss='categorical_crossentropy',
              metrics=['acc'])
model.fit(x_, y_binary, epochs=100)

La rete che userò sarà simulata da una classe scritta da me stesso, quindi i problemi di memoria.
Aric

Se si desidera ridurre l'utilizzo della memoria da parte della rete, ridurre il numero di possibili ingressi (ruotando) aiuterà ad avere una rete più piccola. Più è facile il compito di apprendimento è la rete più piccola necessaria. In questo caso la pre-elaborazione sarebbe migliore. Tuttavia NN è per l'apprendimento dei concetti e per imparare il concetto di Game of Life dovresti nutrirti in tutti i modelli. Se il tuo obiettivo è ridurre al minimo l'impronta della memoria, risolvi il problema in modo lineare.
Manngo,

Se la memoria non è un problema, preferirei che la rete eseguisse questa operazione per gli stessi motivi indicati. La pre-elaborazione rimuove parte dell'attività dalla rete, semplificandola.
Aric

Corretto, quindi vai alla pre-elaborazione. Penso che con questo la risposta alla domanda. Puoi scegliere di implementarlo se riscontri problemi con la memoria. Suggerimento: utilizzare float per i pesi che richiedono solo 32 bit anziché il doppio che richiede 64. In questo modo verrà utilizzata meno memoria.
Manngo,

4

Hai identificato un'ottimizzazione nel tuo spazio problematico e desideri inserirla nella tua rete neurale. Suggerisco la preelaborazione: componi la tua ottimizzazione con una rete neurale che fa un sottoinsieme di ciò che desideri.

In altre parole, normalizza i tuoi input codificando manualmente un algoritmo di rotazione che ruota gli input per catturare l'equivalenza evidenziata nel tuo post. Quindi alimentare l'output di questa trasformazione nella rete neurale, per la formazione e tutti gli altri usi. Ciò significa che stai addestrando la rete neurale per affrontare il sotto-problema che hai identificato - le rotazioni sono ridondanti.

Metti alla prova il tuo normalizzatore generando input casuali, ruotandolo su tutte e quattro le potenziali trasformazioni, esegui il normalizzatore su ognuna, quindi verifica che siano tutti equivalenti.


1

Per essere puristi al riguardo, inizia considerando l'entrata in modo diverso, come una matrice circolare di dimensioni quattro, ogni elemento contenente una coppia di bit e inoltre un bit centrale:

... 01, 01, 11, 10 ...

0

Durante la progettazione della rete, continuare questa struttura circolare e il paradigma del punto centrale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.