Search code examples
keraskeras-layer

How to give input to the middle layer in keras


I want to use pre-trained vgg-19 after popping last layer then adding 2 FC(Dense) layer. I want to give input to one of these FC layer a binary variable(Male or female). How can I achieve it.


Solution

  • What you need a two-input and one-output network, where each input has its own feature extraction and both features fused before predicting the final output.

    Below is an example.

    import keras
    from keras.applications.vgg19 import VGG19
    from keras.layers import Input, Dense, Concatenate
    from keras.models import Model
    
    #-------------------------------------------------------------------------------
    # Define your new inputs
    # Here I pretend that your new task is a classification task over 100 classes
    #-------------------------------------------------------------------------------
    gender_input = Input(shape=(1,), name='gender_input')
    image_input  = Input(shape=(224,224,3), name='image_input')
    num_classes  = 100
    #-------------------------------------------------------------------------------
    # define your pretrained feature extraction
    # you may do something different than below
    # but the point here is to have a pretrained model for `featex`
    # so you may define it differently
    #-------------------------------------------------------------------------------
    pretrained   = VGG19()
    featex       = Model( pretrained.input, pretrained.layers[-2].output, name='vgg_pop_last' )
    # consider to freeze all weights in featex to speed-up training
    image_feat   = featex( image_input )
    #-------------------------------------------------------------------------------
    # From here, you may play with different network architectures
    # Below is just one example
    #-------------------------------------------------------------------------------
    image_feat   = Dense(128, activation='relu', name='image_fc')( image_feat )
    gender_feat  = Dense(16, activation='relu', name='gender_fc')( gender_input )
    # mix information from both information
    # note: concatenation is only one of plausible way to mix information
    concat_feat  = Concatenate(axis=-1,name='concat_fc')([image_feat, gender_feat])
    # perform final prediction
    target       = Dense(num_classes, activation='softmax', name='pred_class')( concat_feat )
    #-------------------------------------------------------------------------------
    # Here is your new model which contains two inputs and one new target
    #-------------------------------------------------------------------------------
    model = Model( inputs=[image_input, gender_input], outputs=target, name='myModel')
    
    print model.summary()