36

Vorrei progettare una rete profonda con uno (o più) strati convoluzionali (CNN) e uno o più strati nascosti completamente collegati in cima.
Per reti profonde con livelli completamente connessi, esistono metodi in theano per la pre-formazione senza supervisione, ad esempio utilizzando denoising auto-encoders o RBMs.Pre-allenamento senza supervisione per rete neurale convoluzionale in theano

La mia domanda è: come posso implementare (in theano) una fase di pre-allenamento senza supervisione per strati convoluzionali?

Non mi aspetto una risposta completa come risposta, ma apprezzerei un collegamento a un buon tutorial o un riferimento affidabile.

+0

Nota che il pre-allenamento senza supervisione non è quasi mai usato più (per quanto ne so). – pir

+0

@pir lo so. ma a volte può essere ancora utile – Shai

+0

@pir: perché non viene più utilizzato? C'è qualcosa di nuovo che è meglio? – oysteijo

risposta

30

This paper descrive un approccio per la creazione di un autoencoder convoluzionale sovrapposto. Sulla base di quel documento e di alcune ricerche su Google, sono riuscito a implementare la rete descritta. Fondamentalmente, tutto ciò di cui si ha bisogno è descritto nella rete convoluzionale di Theano e nel denoising delle esercitazioni di autoencoder con un'eccezione cruciale: come invertire il passo del max-pooling nella rete convoluzionale. Sono stato in grado di farlo utilizzando un metodo da this discussion - la parte più difficile è quella di trovare le dimensioni corrette per W_prime in quanto queste dipenderanno dalle dimensioni del filtro feed forward e dal rapporto di pooling. Ecco la mia funzione di inversione:

def get_reconstructed_input(self, hidden): 
     """ Computes the reconstructed input given the values of the hidden layer """ 
     repeated_conv = conv.conv2d(input = hidden, filters = self.W_prime, border_mode='full') 

     multiple_conv_out = [repeated_conv.flatten()] * np.prod(self.poolsize) 

     stacked_conv_neibs = T.stack(*multiple_conv_out).T 

     stretch_unpooling_out = neibs2images(stacked_conv_neibs, self.pl, self.x.shape) 

     rectified_linear_activation = lambda x: T.maximum(0.0, x) 
     return rectified_linear_activation(stretch_unpooling_out + self.b_prime.dimshuffle('x', 0, 'x', 'x')) 
+0

Ciao senecaur - Ho letto il giornale ma non riuscivo a capire l'architettura della rete. Puoi fornire maggiori dettagli sull'architettura della rete che hai usato per pretrattare? Strato per strato. E poi - hai usato la stessa rete per finetune? Ho appena cambiato il livello di output dalle immagini alle etichette supervisionate? Grazie mille – Run2

+0

Ho sollevato una domanda pertinente in CrossValidated http://stats.stackexchange.com/questions/137537/what-is-the-architecture-of-a-ackack-convolutional-autoencoder. Sarò grato se senecaur - puoi inserire una risposta lì. Grazie – Run2

+0

@senecaur Se stai usando pesi legati, W_prime dovrebbe essere la versione girata dell'originale W (o sbaglio?). Come riesci a creare questa matrice nella notazione Theano? – mmohaveri