2016-05-01 21 views
8

Ho un problema nel trovare la mappatura corretta dei pesi per trasformare uno strato denso in uno strato convoluzionale.Python keras come trasformare uno strato denso in uno strato convoluzionale

Questo è un estratto di un ConvNet che sto lavorando:

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

Dopo la MaxPooling, l'ingresso è di forma (512,7,7). Vorrei trasformare il denso strato in uno strato convoluzionale per farlo sembrare come questo:

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

Tuttavia, non so come ho bisogno di ridisegnare i pesi al fine di mappare correttamente i pesi appiattite al (4096,512,7,7) struttura necessaria per lo strato convoluzionale? In questo momento, i pesi dello strato denso sono di dimensione (25088,4096). Ho bisogno di mappare in qualche modo questi 25088 elementi in una dimensione di (512,7,7) pur mantenendo la corretta mappatura dei pesi ai neuroni. Finora, ho provato diversi modi di rimodellare e quindi di trasporre ma non sono stato in grado di trovare la mappatura corretta.

Un esempio di quello che sto provando sarebbe questo:

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

ma non traccia correttamente i pesi. Ho verificato se la mappatura è corretta confrontando l'output per entrambi i modelli. Se fatto correttamente, prevedo che l'output dovrebbe essere lo stesso.

risposta

6

Stai ancora cercando una soluzione? Eccolo:

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

nel tuo caso:

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

La parte difficile è filtri conv flipping [:,:, :: - 1, :: - 1]. Theano non ha correlazione tra convoluzione (diversamente dal caffè, ad esempio). Quindi, in Keras filtrata come:

1 0 
0 0 

applicato alla matrice:

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

risultati in matrice:

7 8 9 0 
2 3 4 5 

non questo, come ci si aspetterebbe di correlazione:

1 2 3 4 
6 7 8 9 

Per far funzionare le cose come previsto, è necessario ruotare i filtri di 180 gradi. Ho appena risolto questo problema per me stesso, spero che questo sia di aiuto per te o per gli altri. Saluti.