La formazione di una rete neurale per la regressione prevede sempre la media


9

Sto addestrando una semplice rete neurale convoluzionale per la regressione, in cui il compito è prevedere la posizione (x, y) di una scatola in un'immagine, ad esempio:

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

L'output della rete ha due nodi, uno per x e uno per y. Il resto della rete è una rete neurale convoluzionale standard. La perdita è un errore quadrato medio standard tra la posizione prevista della scatola e la posizione di verità sul terreno. Mi sto allenando su 10000 di queste immagini e sto convalidando il 2000.

Il problema che sto riscontrando è che anche dopo un allenamento significativo, la perdita non diminuisce davvero. Dopo aver osservato l'output della rete, noto che la rete tende a produrre valori vicini allo zero, per entrambi i nodi di output. Pertanto, la previsione della posizione del riquadro è sempre al centro dell'immagine. C'è qualche deviazione nelle previsioni, ma sempre intorno allo zero. Di seguito mostra la perdita:

inserisci qui la descrizione dell'immagine

Ho eseguito questo per molte più epoche di quelle mostrate in questo grafico e la perdita non diminuisce mai. È interessante notare che qui la perdita aumenta effettivamente ad un certo punto.

Quindi, sembra che la rete stia solo prevedendo la media dei dati di allenamento, piuttosto che apprendere in modo adeguato. Qualche idea sul perché questo potrebbe essere? Sto usando Adam come ottimizzatore, con un tasso di apprendimento iniziale di 0,01, e relus come attivazioni


Se sei interessato ad alcuni dei miei codici (Keras), è di seguito:

# Create the model
model = Sequential()
model.add(Convolution2D(32, 5, 5, border_mode='same', subsample=(2, 2), activation='relu', input_shape=(3, image_width, image_height)))
model.add(Convolution2D(64, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Convolution2D(128, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(2, activation='linear'))


# Compile the model
adam = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=adam)


# Fit the model
model.fit(images, targets, batch_size=128, nb_epoch=1000, verbose=1, callbacks=[plot_callback], validation_split=0.2, shuffle=True)

Le immagini sui migliori esempi dei tuoi campioni reali? Sono 5 campioni separati? Sembra che non ci siano informazioni nelle immagini che possano aiutare a generalizzare. Voglio dire, non hai bisogno di una rete neurale per trovare la posizione x, y del quadrato bianco, puoi semplicemente analizzare l'immagine e cercare un pixel bianco. Spiega un po 'di più sulla tua visione di questo modello. Esiste un modello temporale in base al quale si prevede la posizione successiva?
Photox

Ciao, e sì, le immagini sono 5 campioni separati. Non sono sicuro di come siano renderizzati per te, ma dovrebbero essere 5 singole immagini quadrate (ho cambiato un po 'il layout per aiutare ...). Sì, mi rendo conto che non hai bisogno di una rete neurale per questo compito, ma è solo un esperimento di prova per aiutarmi a imparare come fare la regressione con una rete neurale. Non capisco cosa intendi perché non ci sono informazioni per aiutare a generalizzare .... Ogni coppia di allenamento è costituita da un'immagine quadrata e da un vettore bidimensionale della posizione (x, y) della piazza. Grazie :)
Karnivaurus,

1
1) La tua forma di input sul primo livello conv sta usando 3 (rbg) canali, ma i tuoi dati sono in scala di grigi (1 canale) 2) Non hai bisogno di molti livelli e filtri conv, in effetti penso che un singolo livello, e una manciata di piccoli chicchi andrà bene.
Photox

Sei sicuro che le immagini corrispondano effettivamente agli obiettivi?
user31264,

1
Come dice @photox, non sono necessari i livelli conv. L'aggiunta di questi rende più difficile per l'ottimizzatore trovare una buona soluzione. Se rimuovi i 3 livelli conv, sospetto che il tuo "modello" funzionerà.
Pieter,

Risposte:


9

L'ottimizzatore non è in grado di convergere in una soluzione (sub) ottimale. Perché? Il tuo problema è troppo semplice e / o il tuo modello è troppo complesso.

Problema troppo semplice

Come già detto da @photox questo problema può essere risolto con un solo livello nascosto. Ho persino il sospetto che possa essere fatto senza un livello nascosto. Questo perché questo problema è lineare separabile .

1/height/width2/heightwidthnn/heightwidthheightwidthi pixel sono diversi da zero (ad es. il bias è uguale al valore di colore grigio) l'attivazione dell'output x è uguale al centro del quadrato. Quindi, una funzione lineare può calcolare la posizione del quadrato.

Esistono diverse soluzioni:

  • Scegli un problema più difficile, ad esempio la classificazione delle immagini
  • Aggiungi rumore, ad esempio sale e pepe o rumore bianco
  • Rendi il problema più difficile, ad esempio predicendo la posizione di un quadrato rosso mentre ci sono molti cerchi di colore diverso sullo sfondo

Modello troppo complesso

Il tuo modello ha alcune parti che aggiungono molta complessità senza aiutare l'ottimizzatore a trovare un dolce ottimale.

5×5

Un altro esempio è l'ottimizzatore Adam con molti parametri extra. L'ottimizzatore Adam potrebbe funzionare bene con questi parametri, ma perché non iniziare con un semplice SGDottimizzatore con valori predefiniti.

Quindi puoi effettuare diverse ottimizzazioni:

  • usare LinearRegressionda scikit-learn. OK, questo non è quello che vuoi, ma voglio solo illustrare quanto sia eccessivamente complesso questo modello.
  • Rimuovere gli strati conv
  • Riduci le dimensioni dei Denselivelli nascosti
  • Usa l' SGDottimizzatore predefinito
  • Se stai usando un livello nascosto, dovresti provare sigmoidun'attivazione. Puoi pensare a ciascuno dei nodi del livello nascosto come a rilevare se un quadrato si trova in una determinata posizione.
  • Se tutto ciò non funziona, sperimenta un po 'il tasso di apprendimento per scoprire se è troppo alto o troppo basso.

Ps

Penso che ti piacerà questo post di Adit Deshpande.


Fammi sapere se queste soluzioni hanno cambiato il comportamento degli ottimizzatori.
Pieter,

Grazie, è molto utile. Sto lavorando per provare i tuoi suggerimenti. Tuttavia, non capisco il tuo primo punto. Sono confuso sul perché, se il problema è troppo semplice, è più difficile da ottimizzare rispetto a un problema più complesso. Per una determinata rete, perché un problema più semplice sarebbe più difficile da ottimizzare rispetto a un problema più complesso? In un semplice problema, avrei pensato che ci sarebbero stati gradienti molto forti e un ottimo ottimale globale. Ma il tuo primo punto afferma che la semplicità del problema rende difficile l'ottimizzazione, suggerendo che un problema più complesso aiuterebbe l'ottimizzazione ...
Karnivaurus,

0

Sembra un tipico problema di overfitting. I tuoi dati non forniscono informazioni sufficienti per ottenere il risultato migliore. Scegli il complesso NN con il tuo treno per ricordare tutte le sfumature dei dati del treno . La perdita non può mai essere zero, come è nel tuo grafico. A proposito, sembra che la tua validazione abbia un bug o un set di validazione non va bene per la validazione perché anche la perdita di validazione sta diventando zero.


4
La domanda dice che la rete produce quasi sempre zero. Sarebbe un caso di grave insufficienza , non eccessiva. Non vi è inoltre alcun divario tra l'allenamento e l'errore di convalida sulla curva di apprendimento, indicando che il sovradimensionamento non è il problema (l'errore non è zero, la scala è logaritmica)
user20160

0

Sto affrontando lo stesso problema con il mio set di dati. Si scopre che nel mio caso i predittori sono altamente concentrati con una varianza molto piccola. È necessario verificare la varianza delle variabili di previsione e vedere come viene distribuita.Distribuzione della variabile che sto cercando di prevedere

Tuttavia, alcune trasformazioni sulla variabile di output possono essere eseguite per modificare o cambiare la sua scala. Ciò potrebbe comportare una distribuzione del tipo più uniforme. Ad esempio, nelle attività di riconoscimento delle immagini l'equalizzazione dell'istogramma o il miglioramento del contrasto a volte funzionano a favore di un corretto processo decisionale.


-1

In realtà stavo lavorando su un problema molto simile. Fondamentalmente, avevo un mucchio di punti su uno sfondo bianco e stavo allenando un NN a riconoscere il punto che era stato posizionato per primo sullo sfondo. Il modo in cui ho scoperto di funzionare era usare solo uno strato di neuroni completamente connesso (quindi un NN a 1 strato). Ad esempio, per un'immagine 100x100, avrei 10.000 neuroni di input (i pixel) collegati direttamente a 2 neuroni di output (le coordinate). In PyTorch, quando ho convertito i valori dei pixel in un tensore, stava normalizzando automaticamente i miei dati, sottraendo la media e dividendo per la deviazione standard. In normali problemi di apprendimento automatico, questo va bene, ma non per un'immagine in cui potrebbe esserci una disparità nel numero di pixel colorati in un'immagine (cioè il tuo dove ci sono solo pochi pixel bianchi). Così, Ho normalizzato manualmente dividendo tutti i valori di intensità dei pixel per 255 (quindi sono ora compresi nell'intervallo 0-1 senza la tipica tecnica di normalizzazione che tenta di adattare tutti i valori di intensità a una distribuzione normale). Quindi, ho ancora avuto problemi perché prevedeva la coordinata media dei pixel nel set di addestramento. Quindi, la mia soluzione è stata quella di impostare un tasso di apprendimento molto alto, che va contro quasi tutti gli istruttori e tutorial ML. Invece di usare 1e-3, 1e-4, 1e-5, come la maggior parte delle persone dice, stavo usando un tasso di apprendimento di 1 o 0,1 con discesa gradiente stocastica. Ciò ha risolto i miei problemi e la mia rete ha finalmente imparato a memorizzare il mio set di allenamento. Non si generalizza a un set di test troppo bene, ma almeno funziona in qualche modo, che è una soluzione migliore di quella che la maggior parte degli altri ha suggerito sulla tua domanda. ora si trova nell'intervallo 0-1 senza la tipica tecnica di normalizzazione che cerca di adattare tutti i valori di intensità a una distribuzione normale). Quindi, ho ancora avuto problemi perché prevedeva la coordinata media dei pixel nel set di addestramento. Quindi, la mia soluzione è stata quella di impostare un tasso di apprendimento molto alto, che va contro quasi tutti gli istruttori e tutorial ML. Invece di usare 1e-3, 1e-4, 1e-5, come la maggior parte delle persone dice, stavo usando un tasso di apprendimento di 1 o 0,1 con discesa gradiente stocastica. Ciò ha risolto i miei problemi e la mia rete ha finalmente imparato a memorizzare il mio set di allenamento. Non si generalizza a un set di test troppo bene, ma almeno funziona in qualche modo, che è una soluzione migliore di quella che la maggior parte degli altri ha suggerito sulla tua domanda. ora si trova nell'intervallo 0-1 senza la tipica tecnica di normalizzazione che cerca di adattare tutti i valori di intensità a una distribuzione normale). Quindi, ho ancora avuto problemi perché prevedeva la coordinata media dei pixel nel set di addestramento. Quindi, la mia soluzione è stata quella di impostare un tasso di apprendimento molto alto, che va contro quasi tutti gli istruttori e tutorial ML. Invece di usare 1e-3, 1e-4, 1e-5, come la maggior parte delle persone dice, stavo usando un tasso di apprendimento di 1 o 0,1 con discesa gradiente stocastica. Ciò ha risolto i miei problemi e la mia rete ha finalmente imparato a memorizzare il mio set di allenamento. Non si generalizza a un set di test troppo bene, ma almeno funziona in qualche modo, che è una soluzione migliore di quella che la maggior parte degli altri ha suggerito sulla tua domanda.

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.