2017-04-09 5 views
2

Je couche Conv2D définit comme:
Comment obtenir correctement les poids de couche de Conv2D dans keras?

Conv2D(96, kernel_size=(5, 5), 
      activation='relu', 
      input_shape=(image_rows, image_cols, 1), 
      kernel_initializer=initializers.glorot_normal(seed), 
      bias_initializer=initializers.glorot_uniform(seed), 
      padding='same', 
      name='conv_1') 

Ceci est la première couche dans mon réseau.
Les dimensions d'entrée sont de 64 sur 160, l'image est de 1 canal.
J'essaie de visualiser les poids de cette couche convolutionnelle, mais je ne sais pas comment les obtenir.
Voici comment je fais maintenant:

1.Call

layer.get_weights()[0] 

Ce returs un tableau de forme (5, 5, 1, 96). 1 est parce que les images sont à 1 canal.

2.Take 5 par 5 filtres par

layer.get_weights()[0][:,:,:,j][:,:,0] 

Très laid, mais je ne suis pas sûr de savoir comment simplifier, les commentaires sont très appréciés.

Je ne suis pas sûr dans ces 5 par 5 carrés. Sont-ils des filtres en fait?
Si personne d'autre ne pourrait s'il vous plaît dire comment attraper correctement les filtres du modèle?

Répondre

4

J'ai essayé d'afficher les poids comme si seulement le premier 25. J'ai la même question que vous faites est-ce le filtre ou autre chose. Il ne semble pas que ce soit les mêmes filtres qui sont dérivés de réseaux de croyances profondes ou de RBM empilés.

Voici les poids non formés: untrained weights visualisés

et voici les poids formés:

trained weights

Étrangement il n'y a pas de changement après la formation! Si vous les comparez, ils sont identiques.

puis les filtres RBM DBN couche 1 sur le dessus et la couche 2 sur le fond: DBM RBM filters

Si je mets kernel_intialization = « les » je reçois des filtres qui ont l'air bien, mais la perte nette diminue jamais mais avec beaucoup modifications d'essai et d'erreur:

Voici le code pour afficher les poids/filtres de convection 2D.

ann = Sequential() 
    x = Conv2D(filters=64,kernel_size=(5,5),input_shape=(32,32,3)) 
    ann.add(x) 
    ann.add(Activation("relu")) 

...

x1w = x.get_weights()[0][:,:,0,:] 
    for i in range(1,26): 
     plt.subplot(5,5,i) 
     plt.imshow(x1w[:,:,i],interpolation="nearest",cmap="gray") 
    plt.show() 

    ann.fit(Xtrain, ytrain_indicator, epochs=5, batch_size=32) 

    x1w = x.get_weights()[0][:,:,0,:] 
    for i in range(1,26): 
     plt.subplot(5,5,i) 
     plt.imshow(x1w[:,:,i],interpolation="nearest",cmap="gray") 
    plt.show() 

--------------------------- ----- MISE A JOUR J'ai donc essayé à nouveau avec un taux d'apprentissage de 0,01 au lieu de 1e-6 et utilisé les images normalisées entre 0 et 1 au lieu de 0 et 255 en divisant les images par 255.0.Maintenant, les filtres de convolution changent et la sortie du premier filtre convolutionnel ressemble à ceci: Untrained Weights

Le filtre formé vous remarquerez est changé (pas de beaucoup) avec un taux d'apprentissage raisonnable: Trained Convolution Filter

ici est l'image sept de l'ensemble de test-10 ICRA: Image 7 CIFAR-10 Car

Et voici la sortie de la première couche de convolution: Convolution Layer Output

Et si je prends la dernière laye de convolution r (pas de couches denses entre) et l'alimenter vers un classificateur non formé il est similaire à la classification des images brutes en termes de précision mais si j'entraîne les couches de convolution, la dernière sortie de la couche de convolution augmente la précision du classifieur. Donc, je voudrais conclure que les couches de convolution sont en effet des filtres ainsi que des poids.

+0

Merci pour votre réponse! C'est une chose vraiment bizarre ici: les poids sont similaires en cas d'initialisation aléatoire. J'utilise l'initialisation de glorot recommandée pour les couches de conv. La question la plus de confusion pour moi est: nous formons le réseau mais éprouvons les mêmes poids. Qu'avons nous entrainé? Vous n'avez pas de réponse à cela ... –

+0

Alors, quelle est la troisième dimension des poids? Dans 'x1w = x.get_weights() [0] [:,:, 0,:]', le 0 dans '[:,:, 0,:]'. Je pense que les deux premiers dims sont le noyau x et y, et le dernier est le nombre de noyaux - mais je n'ai aucune idée de ce qu'est la 3ème dimension. Cela semble être la dimension de la sortie de la couche précédente, mais je ne comprends pas pourquoi ou ce que cela signifie vraiment. – wordsforthewise

+0

Le 0 est le canal rouge. Les trois dimensions sont vert et bleu rouge. Le premier est x le second est y le troisième est le canal et le dernier est le nième convolutions. – John