2009-03-16 23 views
17

Ho una domanda che può essere banale ma non è descritta da nessuna parte che ho guardato. Sto studiando reti neurali e ovunque guardo c'è un po 'di teoria e qualche esempio banale con alcuni 0 e 1 come input. Mi chiedo: devo mettere solo un valore come valore di input per un neurone, o può essere un vettore di, diciamo, 3 valori (per esempio il colore RGB)?Reti neurali - valori di input

risposta

1

Può essere quello che vuoi, purché tu scriva di conseguenza la tua funzione interiore.

Gli esempi citati utilizzano [0; 1] come dominio, ma è possibile utilizzare R, R² o qualsiasi altra cosa si desideri, purché la funzione che si utilizza nei neuroni sia definita in questo dominio.

Nel tuo caso, è possibile definire le funzioni su R3 per consentire valori RGB per essere gestiti

Un esempio banale: usare (x1, y1, z1), (x2, y2, z2) -> (ax1 + x2, by1 + y2, cz1 + z2) come funzione per trasformare due colori in uno, ab e c come i tuoi coefs di apprendimento, che determinerai durante la fase di apprendimento.

Informazioni molto dettagliate (compresa la risposta alla tua domanda) sono disponibili on Wikipedia.

+0

ma se un set di dati rimane in una relazione con un altro set di dati dovrebbero essere forniti a diversi neuroni, non dovrebbero? o può essere l'input di un vettore? – agnieszka

+0

sì, può essere un input di un vettore; R3 significa un vettore di 3 membri (beh, banalmente parlando) – Brann

+0

beh sì, ho capito: D voglio dire se hai 3 colori di un pixel in 3 immagini successive e sai che le differenze tra questi colori influenzano il risultato se dovessi avere 3 neuroni per questi 3 colori o un neurone per un input contenente questi 3 colori? o scelgo? – agnieszka

6

Quando si tratta di dati multidimensionali, credo che una rete neurale a due strati sia in grado di fornire un risultato migliore.

Nel tuo caso:

R[0..1] => (N1)----\ 
        \ 
G[0..1] => (N2)-----(N4) => Result[0..1] 
        /
B[0..1] => (N3)----/ 

Come si può vedere, il neurone N4 in grado di gestire 3 voci.

L'intervallo [0..1] è una convenzione ma buona. In questo modo, puoi facilmente codificare una serie di classi di neuroni generici che possono assumere un numero arbitrario di voci (ho avuto classi template C++ con il numero di voci come parametro template personalmente). Quindi codifichi la logica dei tuoi neuroni una volta, poi giochi con la struttura della rete e/o le combinazioni di funzioni all'interno dei tuoi neuroni.

+0

ma non è un dato tridimensionale .... è un valore per un neurone – agnieszka

+0

il problema è che ho un insieme di pixel di un'immagine, ho alcune (3?) Immagini successive di una vista che me ne danno un po '(3?) Colori diversi di un pixel. ogni colore è composto da 3 valori. la domanda è - per continuare – agnieszka

+1

la domanda è se io desing un neurone di input per ogni r e g eb per ogni pixel per ogni immagine o posso mettere un colore (r, g, valore b) come input per un neurone o forse 3 colori successivi? – agnieszka

2

Normalmente un singolo neurone prende come input più numeri reali e genera un numero reale, che in genere viene calcolato applicando la funzione sigmoide alla somma dei numeri reali (ridimensionati, quindi più o meno un offset costante).

Se si desidera inserire, ad esempio, due vettori RGB (2 x 3 real), è necessario decidere come si desidera combinare i valori. Se si aggiungono tutti gli elementi insieme e si applica la funzione sigmoid, equivale a ottenere sei real "piatti". D'altra parte, se si elaborano gli elementi R, quindi gli elementi G e gli elementi B, tutti singolarmente (ad esempio somma o sottrarre le coppie), si hanno in pratica tre neuroni indipendenti.

Quindi, in breve, no, un singolo neurone non accetta valori vettoriali.

+0

quindi in una situazione che hai descritto hai 3 neuroni di input, ognuno dei quali riceve un valore costituito da tre valori, per esempio tre R? – agnieszka

+0

Ah, lì dove in realtà solo due R nell'esempio sopra, ma sì, un modo sarebbe di dedicare un neurone per un elemento. –

9

Le risposte di cui sopra sono tecnicamente corretta, ma non spiegano la semplice verità: non c'è mai una situazione in cui avresti bisogno di dare un vettore di numeri per un singolo neurone.

Dal punto di vista pratico ciò è dovuto al fatto che (come una delle soluzioni precedenti ha mostrato) è possibile avere un neurone per ciascun numero in un vettore e quindi avere tutti questi input per un singolo neurone. Questo dovrebbe darti il ​​comportamento desiderato dopo l'allenamento, poiché il secondo strato di neuroni può effettivamente utilizzare l'intero vettore.

Da un punto di vista matematico, esiste un teorema fondamentale della teoria della codifica che afferma che qualsiasi vettore di numeri può essere rappresentato come un numero singolo. Quindi, se davvero non vuoi uno strato extra di neuroni, puoi semplicemente codificare i valori RGB in un singolo numero e inserirli nel neurone. Tuttavia, questa funzione di codifica potrebbe rendere più difficile la maggior parte dei problemi di apprendimento, quindi dubito che questa soluzione varrebbe la pena nella maggior parte dei casi.

Riassumendo: le reti neurali artificiali vengono utilizzate senza dare un vettore a un'unità di input, ma a causa di ciò non perdono potenza di calcolo.

1

Utilizzare la lunghezza d'onda della luce normalizzata allo spettro visibile come ingresso.

Ci sono alcune equazioni approssimative sulla rete. Cercare la conversione da RGB a lunghezza d'onda o utilizzare il modello di colore HSL ed estrarre il componente Hue ed eventualmente usare anche Saturazione e Luminosità. Bene ...

3

Generalmente, l'input per un singolo neurone è un valore compreso tra 0 e 1. Tale convenzione non è solo per facilità di implementazione, ma perché la normalizzazione dei valori di input per lo stesso intervallo garantisce che ciascun input abbia pesi simili . (Se hai alcune immagini con un colore a 8 bit con valori di pixel tra 0 e 7 e alcune immagini con un colore a 16 bit con valori di pixel tra 0 e 255 probabilmente non vorrai favorire le immagini a 24 bit solo perché i valori numerici sono Analogamente, probabilmente vorrai che le tue immagini abbiano le stesse dimensioni.)

Per quanto riguarda l'uso di valori di pixel come input, è molto comune cercare di raccogliere una rappresentazione di livello superiore dell'immagine rispetto ai pixel (more info).). Ad esempio, dato un 5 x 5 (normalizzata) immagine scala di grigi:

[1 1 1 1 1] 
[0 0 1 0 0] 
[0 0 1 0 0] 
[0 0 1 0 0] 
[0 0 1 0 0] 

Si potrebbe utilizzare una funzione le seguenti matrici per aiutare a scoprire caratteristiche orizzontali, verticali e diagonali delle immagini. Vedere python haar face detection per ulteriori informazioni.

[1 1] [0 0] [1 0] [0 1] [1 0], [0 1] 
[0 0], [1 1], [1 0], [0 1], [0 1], [1 0] 

Per costruire il vettore di ingresso, v, su questo, prendere la prima matrice 2x2 funzionalità e "applica" con la moltiplicazione elemento saggio alla prima posizione nell'immagine. L'applicazione,

[1 1] (the first feature matrix) to [1 1] (the first position in the image) 
[0 0]        [0 0] 

si tradurrà in 2 perché 1 * 1 + 1 * 1 + 0 * 0 + 0 * 0 = 2. Append 2 al retro del vettore d'ingresso per questa immagine. Quindi sposta questa matrice delle funzioni nella posizione successiva, una a destra, e applicala nuovamente, aggiungendo il risultato al vettore di input. Ripetilo ripetutamente per ogni posizione della matrice delle caratteristiche e per ciascuna delle matrici delle caratteristiche. Questo costruirà il tuo vettore di input per una singola immagine. Assicurati di costruire i vettori nello stesso ordine per ogni immagine.

In questo caso l'immagine è in bianco e nero, ma con i valori RGB è possibile estendere l'algoritmo per eseguire lo stesso calcolo ma aggiungere 3 valori al vettore di input per ciascun pixel, uno per ciascun colore. Questo dovrebbe fornire un vettore di input per immagine e un singolo input per ciascun neurone. I vettori dovranno quindi essere normalizzati prima di passare attraverso la rete.

Problemi correlati