2017-06-02 2 views
0

Ich möchte vorgefeilte Modelle Faltungsfunktionen als Eingabe-Features für ein Master-Modell verwenden.Keras merge/verkettete Modelle Ausgänge als neue Ebenen

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) 

ist hier der Schlüssel Teil dessen, was ich tun, in 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 

All dies gibt:

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' 

Hier info ist Typ:

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

Hinweis : die Modelle, die ich von 012 bekommehaben ihre compile() Funktion bereits aufgerufen. Also, wie soll ich meine Modelle richtig verketten? Warum funktioniert es nicht? Ich nehme an, dass das vielleicht etwas damit zu tun hat, wie die Eingänge den Submodellen zugeführt werden und wie ich ihre Input-Layer austauschen würde.

Danke für die Hilfe!

Antwort

0

Die Sache funktioniert, wenn wir tun:

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

statt:

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

TLDR: needs Modelle als Schicht bezeichnet werden.

Verwandte Themen