2017-02-08 3 views
0

J'essaye de retirer les couches supérieures d'un modèle que j'ai déjà formé. Ce est le code que j'utilise:L'utilisation de model.pop() modifie le résumé du modèle mais n'affecte pas la sortie.

import os 
import h5py 
import numpy as np 
from keras.preprocessing.image import ImageDataGenerator 
from keras.models import Sequential 
from keras.layers import Convolution2D, MaxPooling2D, ZeroPadding2D 
from keras.layers import Activation, Dropout, Flatten, Dense 

# KERAS_BACKEND=theano python 
import keras 
keras.backend.set_image_dim_ordering("th") 
img_width, img_height = 150, 150 
data_dir = '//shared_directory/projects/try_CD/data/validation' 

nb_train_samples = 2000 
nb_validation_samples = 800 
nb_epoch = 50 



def make_bottleneck_features(model): 
    datagen = ImageDataGenerator(rescale=1./255) 
    generator = datagen.flow_from_directory(
      data_dir, 
      target_size=(img_width, img_height), 
      batch_size=32, 
      class_mode=None, 
      shuffle=False) 
    bottleneck_features = model.predict_generator(generator, nb_validation_samples) 
    return (bottleneck_features) 


model=keras.models.load_model('/shared_directory/projects/think_exp/CD_M1.h5') 
A = make_bottleneck_features(model) 
model.summary()  
for i in range (6): 
    model.pop()  

B = make_bottleneck_features(model) 
model.summary() 

A en juger en comparant les résultats des deux appels à model.summary(), je peux voir que les 6 effet couches supérieures ont été retirées. Cependant, la sortie du modèle (enregistrée en A et B) ne change pas après avoir ignoré ces couches.

Quelle est la source de cet écart? Comment puis-je récupérer la sortie du calque désiré au lieu de celui du modèle entier?

Merci d'avance!

Répondre

2

Vous ne pouvez pas supprimer des calques de ce type. Pour que cela ait un effet, vous devez recompiler le modèle (AKA model.compile).

Mais ce n'est pas la meilleure façon d'obtenir des sorties de couches intermédiaires, vous pouvez simplement utiliser K.function (où K est keras.backend) pour construire une fonction de l'entrée à l'une des couches, puis appeler la fonction. Plus de détails sont disponibles dans this réponse.