2016-05-01 2 views
8

J'ai un problème pour trouver la cartographie correcte des poids afin de transformer une couche dense en une couche convolutionnelle.Python keras comment transformer une couche dense en une couche convolutionnelle

Ceci est un extrait d'un ConvNet que je travaille sur:

model.add(Convolution2D(512, 3, 3, activation='relu')) 
model.add(MaxPooling2D((2,2), strides=(2,2))) 
model.add(Flatten()) 
model.add(Dense(4096, activation='relu')) 

Après la MaxPooling, l'entrée est de la forme (512,7,7). Je voudrais transformer la couche dense en une couche convolutionnel pour la faire ressembler à ceci:

model.add(Convolution2D(512, 3, 3, activation='relu')) 
model.add(MaxPooling2D((2,2), strides=(2,2))) 
model.add(Convolution2D(4096, 7, 7, activation='relu')) 

Cependant, je ne sais pas comment je dois remodeler les poids afin de cartographier correctement les poids aplaties à la (4096,512,7,7) structure nécessaire pour la couche convolutionnelle? À l'heure actuelle, les poids de la couche dense sont de dimension (25088,4096). Je dois en quelque sorte mapper ces 25088 éléments à une dimension de (512,7,7) tout en conservant la cartographie correcte des poids aux neurones. Jusqu'à présent, j'ai essayé plusieurs façons de refaçonner et de transposer, mais je n'ai pas réussi à trouver le mapping correct.

Un exemple de ce que j'ai essayé ce serait:

weights[0] = np.transpose(np.reshape(weights[0],(512,7,7,4096)),(3,0,1,2)) 

mais il ne correspond pas les poids correctement. J'ai vérifié si le mappage est correct en comparant la sortie pour les deux modèles. Si c'est fait correctement, je m'attends à ce que la sortie soit la même.

Répondre

6

Toujours à la recherche de solution? Ici, il est:

new_conv_weights = dense_weights.transpose(1,0).reshape(new_conv_shape)[:,:,::-1,::-1] 

dans votre cas:

weights[0] = weights[0].transpose(1,0).reshape((4096,512,7,7))[:,:,::-1,::-1] 

La partie délicate est filtres conv flipping [:,:, :: - 1, :: - 1]. Theano fait la convolution et non la corrélation (contrairement au café par exemple). Par conséquent, dans Keras filtrer comme:

1 0 
0 0 

appliqué à la matrice:

1 2 3 4 5 
6 7 8 9 0 
1 2 3 4 5 

résultats dans la matrice:

7 8 9 0 
2 3 4 5 

pas, comme on peut s'y attendre avec une corrélation:

1 2 3 4 
6 7 8 9 

Afin de faire fonctionner les choses comme attendu, vous devez faire pivoter les filtres 180 deg. Juste résolu ce problème pour moi-même, j'espère que cela sera utile pour vous ou pour les autres. À votre santé.