2017-10-17 3 views
1

Ich habe ein CNN, das mit Bildern trainiert wird. Ich habe auch die Geometrie (68x2 - 68 Punkte mit x, y Koordinaten) des Gesichts erhalten. Ich möchte die Geometrie nach allen Faltungsschichten kodieren und sie in den vollständig verbundenen Schichten verwenden. Ich verwende das vggFace-Modell.Keras: Verketten von Metadaten in ein CNN

''' 
Load the model 
''' 
vgg_model = VGGFace(
    include_top=False, 
    input_shape=(img_width, img_height, 3)) 


''' 
Customize the model 
''' 
# Add geometry input 
geo_input = Input(shape=(1,136,1)) 
geo_input = Flatten(name='flatten')(geo_input) 


last_layer = vgg_model.get_layer('pool5').output 
x = Flatten(name='flatten')(last_layer) 
x = concatenate([x, geo_input], axis=1) 
x = Dense(hidden_dim, activation='relu', name='fc6')(x) 
x = Dense(hidden_dim, activation='relu', name='fc7')(x) 
out = Dense(nb_class, activation='softmax', name='fc8')(x) 

custom_vgg_model = Model(
    [vgg_model.input, geo_input], 
    out) 

Aber ich die folgende Fehlermeldung:

TypeError: Input layers to a `Model` must be `InputLayer` objects. Received inputs: [<tf.Tensor 'input_1:0' shape=(?, 224, 224, 3) dtype=float32>, <tf.Tensor 'flatten/Reshape:0' shape=(?, ?) dtype=float32>]. Input 1 (0-based) originates from layer type `Flatten`. 

Antwort

1

hier:

# Add geometry input 
geo_input = Input(shape=(1,136,1)) 
geo_input = Flatten(name='flatten')(geo_input) 

In der zweiten Zeile geo_input nicht mehr ein Eingang ist. Es ist eine Ausgabe der Flatten Schicht. Sie übergeben dies an die Model Erstellung. Sie müssen also den korrekten Eingangstensor beibehalten:

geo_input_tensor = Input(shape=(1,136,1)) 
geo_input = Flatten(name='flatten')(geo_input_tensor) 

..... 
...... 

custom_vgg_model = Model([vgg_model.input, geo_input_tensor], out)