2017-06-02 3 views
0

Je souhaite utiliser les cartes convolutionnelles des modèles pré-alignés comme caractéristiques d'entrée pour un modèle maître.Keras fusionne/concatène des sorties de modèles en tant que nouveaux calques

inputs = layers.Input(shape=(100, 100, 12)) 
sub_models = get_model_ensemble(inputs) 
sub_models_outputs = [m.layers[-1] for m in sub_models] 
inputs_augmented = layers.concatenate([inputs] + sub_models_outputs, axis=-1) 

Voici la partie clé de ce que je fais dans get_model_ensemble():

for i in range(len(models)): 
    model = models[i] 
    for lay in model.layers: 
     lay.name = lay.name + "_" + str(i) 
    # Remove the last classification layer to rather get the underlying convolutional embeddings 
    model.layers.pop() 
    # while "conv2d" not in model.layers[-1].name.lower(): 
    #  model.layers.pop() 
    model.layers[0] = new_input_layer 
return models 

Tout cela donne:

Traceback (most recent call last): 
    File "model_ensemble.py", line 151, in <module> 
    model = get_mini_ensemble_net() 
    File "model_ensemble.py", line 116, in get_mini_ensemble_net 
    inputs_augmented = layers.concatenate([inputs] + sub_models_outputs, axis=-1) 
    File "/usr/local/lib/python3.4/dist-packages/keras/layers/merge.py", line 508, in concatenate 
    return Concatenate(axis=axis, **kwargs)(inputs) 
    File "/usr/local/lib/python3.4/dist-packages/keras/engine/topology.py", line 549, in __call__ 
    input_shapes.append(K.int_shape(x_elem)) 
    File "/usr/local/lib/python3.4/dist-packages/keras/backend/tensorflow_backend.py", line 451, in int_shape 
    shape = x.get_shape() 
AttributeError: 'BatchNormalization' object has no attribute 'get_shape' 

est ici Type info:

print(type(inputs)) 
print(type(sub_models[0])) 
print(type(sub_models_outputs[0])) 

<class 'tensorflow.python.framework.ops.Tensor'> 
<class 'keras.engine.training.Model'> 
<class 'keras.layers.normalization.BatchNormalization'> 

Remarque : les modèles que je reçois de 012 La fonction compile() a déjà été appelée. Alors, comment devrais-je concaténer correctement mes modèles? Pourquoi ne fonctionnera-t-il pas? J'imagine que cela a peut-être quelque chose à voir avec la façon dont les entrées seraient alimentées aux sous-modèles et la façon dont j'échangerais à chaud leurs couches d'entrée.

Merci pour l'aide!

Répondre

0

La chose fonctionne si nous faisons:

sub_models_outputs = [m(inputs) for m in sub_models] 

plutôt que:

sub_models_outputs = [m.layers[-1] for m in sub_models] 

TLDR: modèles doit être appelé comme une couche.