Come aggiungere una nuova categoria a un modello di apprendimento profondo?


15

Supponiamo di aver completato l'apprendimento del trasferimento su una rete pre-formata per riconoscere 10 oggetti. Come aggiungere un undicesimo oggetto che la rete può classificare senza perdere tutte le 10 categorie che ho già addestrato né le informazioni del modello pre-addestrato originale? Un amico mi ha detto che la ricerca attiva è in corso in questo campo, ma non riesco a trovare documenti pertinenti o un nome con cui cercare?

Grazie.


Se ti alleni con molta più classe allora c'è? può essere d'aiuto? Ad esempio, supponiamo che tu sappia che non ci saranno più di 1000 classi. Ti alleni fin dall'inizio il tuo classificatore con classe 1000 sulla classe 10 che hai attualmente, e quando hai più classi, tieni il treno su di esse ... Può essere una buona soluzione? Esiste un documento su questo approccio?
Michael

Risposte:


13

Se questo è solo un caso, puoi semplicemente ri-addestrare la rete neurale. Se devi aggiungere spesso nuove classi, questa è una cattiva idea. Quello che vuoi fare in questi casi è chiamato recupero di immagini basato sul contenuto (CBIR), o semplicemente recupero di immagini o ricerca visiva. Spiegherò entrambi i casi nella mia risposta di seguito.

Caso unico

Se ciò accade solo una volta - hai dimenticato l'11a classe, o il tuo cliente ha cambiato idea - ma non accadrà di nuovo , allora puoi semplicemente un undicesimo nodo di output all'ultimo livello. Inizializza i pesi su questo nodo in modo casuale, ma usa i pesi che hai già per gli altri output. Quindi, allenalo come al solito. Potrebbe essere utile fissare alcuni pesi, cioè non allenarli.

Un caso estremo sarebbe quello di allenare solo i nuovi pesi e lasciare tutti gli altri fissi. Ma non sono sicuro che funzionerà così bene - potrebbe valere la pena provare.

Recupero di immagini basato sul contenuto

Considera il seguente esempio: stai lavorando per un negozio di CD, che desidera che i propri clienti possano scattare una foto della copertina di un album e l'applicazione mostra loro il CD che hanno scansionato nel loro negozio online. In tal caso, dovresti ri-addestrare la rete per ogni nuovo CD che hanno nel negozio. Potrebbero essere 5 nuovi CD ogni giorno, quindi riqualificare la rete in questo modo non è adatto.

La soluzione è quella di formare una rete, che mappa l'immagine in uno spazio di funzionalità. Ogni immagine sarà rappresentata da un descrittore, che è ad esempio un vettore a 256 dimensioni. Puoi "classificare" un'immagine calcolando questo descrittore e confrontandolo con il tuo database di descrittori (ovvero i descrittori di tutti i CD che hai nel tuo negozio). Vince il descrittore più vicino nel database.

Come si allena una rete neurale per imparare un simile vettore descrittore? Questo è un campo di ricerca attivo. Puoi trovare lavori recenti cercando parole chiave come "recupero di immagini" o "apprendimento metrico".

In questo momento, le persone di solito prendono una rete pre-allenata, ad esempio VGG-16, tagliano gli strati FC e usano il convoluzionale finale come vettore descrittore. È possibile addestrare ulteriormente questa rete, ad esempio utilizzando una rete siamese con perdita di tripletta.


Ho studiato l'apprendimento one-shot. Pensi che mi possa aiutare?
nnrales,

Non so davvero di apprendimento one-shot. Ma i documenti di deep learning one-shot che ho trovato sembrano abbastanza simili all'approccio CBIR, quindi potrebbe sicuramente essere utile per te
hbaderts,

2

La topologia della rete potrebbe apparire diversa, ma alla fine la rete pre-formata ha un livello che gestisce il riconoscimento di 10 classi originali. Il trucco più semplice (e funzionante) per introdurre l'11 °, 12 ° .. ennesima classe, è quello di utilizzare tutti i livelli prima dell'ultimo come concesso e aggiungere un livello aggiuntivo (in un nuovo modello o come parallelo) che siederà anche sopra a tutti tranne gli ultimi strati, sarà simile allo strato a 10 classi (che è molto probabilmente matmul di strato denso e una matrice di forma [len(dense layer), 10]con bias opzionale).

Il tuo nuovo livello sarebbe un livello matmul con forma [len(dense layer), len(new classes)].

Senza l'accesso ai dati di allenamento originali, avresti due opzioni:

  1. Congelare tutti i pesi negli strati originali consentendo al "nuovo" modello di ottimizzare solo i nuovi pesi. Ciò fornirà esattamente lo stesso potere predittivo per le 10 classi originali e potrebbe offrire prestazioni OK per quelle nuove.
  2. Addestra tutta la rete in una sola volta (propagando l'errore di nuove classi), che potrebbe funzionare per le nuove classi, ma finirai con una soluzione originale inefficace per 10 classi (poiché i pesi verranno cambiati per le classi inferiori e il livello finale non verrà aggiornato per corrispondere a tali modifiche).

Sebbene, dato che hai accesso ai dati di formazione originali, puoi facilmente aggiungere una nuova classe alla rete originale e riqualificarla per supportare 11 classi fuori dalla scatola.


2

Questo può essere fatto facilmente.

Prima costruisci un modello con quelle 10 classi e salva il modello come base_model.

Carica base_model e definisci anche un nuovo modello chiamato new_model as-

new_model = Sequential()

Quindi aggiungi i livelli di base_model a new_model -

# getting all the layers except the last two layers
for layer in base_model.layers[:-2]: #just exclude the last two layers from base_model
    new_model.add(layer)

Ora rendi gli allenamenti del nuovo modello non addestrabili perché non vuoi che il tuo modello venga nuovamente addestrato.

# prevent the already trained layers from being trained again
for layer in new_model.layers:
    layer.trainable = False

Ora che trasferisci l'apprendimento, quando rimuovi gli ultimi livelli, il tipo di modello dimentica le 10 classi, quindi dobbiamo mantenere i pesi del modello_modello nel modello_moderno -

weights_training = base_model.layers[-2].get_weights()
new_model.layers[-2].set_weights(weights_training) 

Ora aggiungi uno strato denso alla fine e in questo esempio formeremo solo questo strato denso.

new_model.add(Dense(CLASSES, name = 'new_Dense', activation = 'softmax'))

Ora allena il modello e spero che dia il giusto risultato per tutte le 11 classi.

Buon apprendimento.

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.