web-dev-qa-db-fra.com

Pré-formation non supervisée pour le réseau de neurones convolutifs dans theeano

Je voudrais concevoir un réseau profond avec une (ou plusieurs) couches convolutionnelles (CNN) et une ou plusieurs couches cachées entièrement connectées sur le dessus.
Pour les réseaux profonds avec des couches entièrement connectées, il existe dans l'anean des méthodes de pré-formation non supervisée, par exemple, en utilisant auto-encodeurs débruitants ou RBMs .

Ma question est: comment puis-je implémenter (dans le même) une étape de pré-formation non supervisée pour les couches convolutives?

Je ne m'attends pas à une implémentation complète comme réponse, mais j'apprécierais un lien vers un bon tutoriel ou une référence fiable.

37
Shai

Cet article décrit une approche pour construire un autoencodeur convolutionnel empilé. Sur la base de ce document et de quelques recherches sur Google, j'ai pu implémenter le réseau décrit. Fondamentalement, tout ce dont vous avez besoin est décrit dans les didacticiels sur le réseau convolutionnel Theano et le débruitage avec une exception cruciale: comment inverser l'étape de regroupement maximal dans le réseau convolutionnel. J'ai pu travailler cela en utilisant une méthode de cette discussion - la partie la plus délicate consiste à déterminer les bonnes dimensions pour W_prime car celles-ci dépendront de la taille des filtres à action directe et du rapport de mise en commun. Voici ma fonction inverseuse:

    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'))
30
senecaur