2017-05-23 3 views
0

Ich baue ein kaskadiertes Modell (ein Autoencoder-Modell gestapelt mit einem Klassifikator). Die Eingabe in den Autoencoder ist ein Satz von Bildern und die Ausgabe des Autoencoders wird einem vortrainierten Klassifizierer zugeführt.kaskadiertes Modell (Autoencoder + Klassifikator) in Keras

auto_input= Input(shape=(ch, height, width), name='x_autoen') 

    auto_output = autoencoder(auto_input) 
    auto_model = Model(input=auto_input, output=auto_output) 

    class_output = classifier(auto_output) 
    class_model = Model(input=auto_output, output=class_output) 

    cascade_model = Model(input=auto_input, output=[auto_output, class_output]) 

    load_classifier_weights(cascade_model, classifier_weights_path) 

    auto_model.compile(optimizer='sgd', loss='mean_squared_error') 
    class_model.compile(optimizer='sgd', loss='binary_crossentropy') 
    cascade_model.compile(optimizer='sgd', loss='binary_crossentropy') 

aber dies gibt den folgenden Fehler zurück.

File "xxxx.py", line 33, in build_model 
class_model = Model(input=auto_output, output=class_output) 
File "/xxx/local/lib/python2.7/site-packages/keras/engine/topology.py", line 1987, in __init__ 
str(layers_with_complete_input)) 
RuntimeError: Graph disconnected: cannot obtain value for tensor x_autoen at layer "x_autoen". The following previous layers were accessed without issue: [] 

Der Code Klassifikator:

def classifier(inputs): 

    conv1 = Convolution2D(32, 3, 3, activation='relu', border_mode='same')(inputs) 
    conv1 = Dropout(0.2)(conv1) 
    conv1 = Convolution2D(32, 3, 3, activation='relu', border_mode='same')(conv1) 
    pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)         
    # 
    conv2 = Convolution2D(64, 3, 3, activation='relu'', border_mode='same')(pool1)  
    conv2 = Dropout(0.2)(conv2) 
    conv2 = Convolution2D(64, 3, 3, activation='relu', border_mode='same')(conv2)  
    pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)          
    # 
    conv3 = Convolution2D(128, 3, 3, activation='relu', border_mode='same')(pool2)  
    conv3 = Dropout(0.2)(conv3) 
    conv3 = Convolution2D(128, 3, 3, activation='relu', border_mode='same')(conv3)  

    up1 = merge([UpSampling2D(size=(2, 2))(conv3), conv2], mode='concat', concat_axis=1)#192x24x24 
    conv4 = Convolution2D(64, 3, 3, activation='relu', border_mode='same')(up1)   
    conv4 = Dropout(0.2)(conv4) 
    conv4 = Convolution2D(64, 3, 3, activation='relu', border_mode='same')(conv4)  
    # 
    up2 = merge([UpSampling2D(size=(2, 2))(conv4), conv1],, mode='concat', concat_axis=1)#96x48x48 
    conv5 = Convolution2D(32, 3, 3, activation='relu', border_mode='same')(up2)   
    conv5 = Dropout(0.2)(conv5) 
    conv5 = Convolution2D(32, 3, 3, activation='relu', border_mode='same')(conv5)  
    # 
    conv6 = Convolution2D(2, 1, 1, activation='relu', border_mode='same')(conv5)   
    conv6 = core.Reshape((2,patch_height*patch_width))(conv6)       
    conv6 = core.Permute((2,1))(conv6)             

    conv7 = core.Activation('softmax')(conv6) 

    return conv7 

Fehler nach Korrekturen gemäß Kommentar des Daniel:

ValueError: The model expects 2 input arrays, but only received one array. Found: array with shape (1000, 1, 48, 48) 

Dies war der Code, den ich für das Training des kaskadierten Netzwerk verwendet wird.

cascade_model .fit(imgs_train, imgs_train, nb_epoch=epochs, batch_size=batch_size, verbose=2, shuffle=True, validation_split=0.1, callbacks=[checkpointer]) 
enter code here 
+0

Überprüfen Sie zunächst "Sichter" -Modell. Ist es vollständig verbunden? Ich meine, geht die Eingabe durch alle Schichten bis zur Ausgabe? Es klingt, als ob das Modell von der Nachricht unterbrochen wird. (Es kann hilfreich sein, den Code an das "Klassifikator" -Modell zu senden). –

+0

Ja, es ist Daniel. Ich habe den obigen Code geschrieben – shaaa

+1

Ihr Modell benötigt zwei Ausgaben, wie Sie es definiert haben: 'cascade_model .fit (imgs_train, [imgs_train, classes_train]'. Wenn Sie nicht zwei Ausgaben geben wollen, dann definieren Sie es mit nur einer Ausgabe. –

Antwort

1

Tatsächlich scheint der Klassifikator verbunden zu sein.

Dann denke ich, dass Sie wahrscheinlich einen unabhängigen Eingang zu class_model geben müssen.

Das System hat wahrscheinlich Probleme, ein Modell in der Mitte des Diagramms zu starten (das Diagramm ist die Reihenfolge der Ebenen, in denen die Ausgabe einer Ebene als Eingabe für eine andere dient).

Obwohl alles verbunden scheint, übergeben Sie einen Tensor, der sich in der Mitte des Diagramms befindet, als Eingabe für ein Modell. Das erzeugt wahrscheinlich ein Problem.

Wenn ich das tue, ich es auf diese Weise:

class_input = Input((shapeforclassifierinput))  
class_output = classifier(class_input) 
class_model = Model(input=class_input, output=class_output) 
#If this gives an error, then your classifier is indeed not connected 
#Then I'd suggest using the Concatenate(axis=1)([UpSampling2D(size=(2, 2))(conv3), conv2])  

Nun Sie kommen beide Modelle auf diese Weise:

cascade_input = Input(shape=(ch, height, width)) 
auto_out = auto_model(cascade_input) 
class_out = class_model(auto_out) 
cascade_model = Model(input=cascade_input, output=[auto_out, class_out]) 
+0

Auf diese Weise entfernt diesen Fehler. Allerdings, wenn ich versuche, die Casca zu trainieren ded Netzwerk gibt es einen weiteren Fehler. Finden Sie die Details des Fehlers oben. – shaaa