简体   繁体   中英

How to add flatten input to keras object model

I'm using concatenate to update the code which used merge previously. However i do not know how to add Flatten() to the input_shape in the keras object model.

Previous version

def linear_model_combined(optimizer='Adadelta'):
    
    modela = Sequential()
    modela.add(Flatten(input_shape=(100, 34)))
    modela.add(Dense(1024))
    modela.add(Activation('relu'))
    modela.add(Dense(512))
    
    modelb = Sequential()
    modelb.add(Flatten(input_shape=(100, 34)))
    modelb.add(Dense(1024))
    modelb.add(Activation('relu'))
    modelb.add(Dense(512))
    
    model_combined = Sequential()
    model_combined.add(merge([modela, modelb], mode='concat'))
    model_combined = concatenate([modela,modelb])
    model_combined.add(Activation('relu'))
    model_combined.add(Dense(256))
    model_combined.add(Activation('relu'))
    
    model_combined.add(Dense(4))
    model_combined.add(Activation('softmax'))

    model_combined.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])

    return model_combined

What i am trying to make it work:

def linear_model_combined(optimizer='Adadelta'):
    
    modela_in = Input(shape=(100,34))
    modela_out1 = Dense(1024,activation='relu',name='layer_a1')(modela_in)
    modela_out2 = Dense(512,activation='relu',name='layer_a2')(modela_out1)
    modela = Model(modela_in,modela_out2)
    
    modelb_in = Input(shape=(100,34))
    modelb_out1 = Dense(1024,activation='relu',name='layer_b1')(modelb_in)
    modelb_out2 = Dense(512,activation='relu',name='layer_b2')(modelb_out1)
    modelb = Model(modelb_in,modelb_out2)
    
    modelconcat_in = concatenate([modela_out2,modelb_out2])
    modelconcat_out1 = Dense(256,activation='relu',name='layer_c1')(modelconcat_in)
    modelconcat_out = Dense(4,activation='softmax',name='layer_c2')(modelconcat_out1)
    
    model_merged = Model([modela_in,modelb_in], modelconcat_out)
    model_merged.compile(loss='categorical_crossentropy',optimizer=optimizer, metrics=['accuracy'])
   
    return model_merged

Model training:

model = linear_model_combined()
hist = model.fit([x_train_speech, x_train_speech2], Y, 
                 batch_size=100, epochs =80, verbose=1, shuffle = True, 
                 validation_split=0.2)

I do not know how to match the shapes exactly. I get the following error:

ValueError: Shapes (None, 4) and (None, 100, 4) are incompatible

So, it worked when i tried to add Flatten() as suggested in the comments. I realized i was trying to use Flatten() in a sequential model coding way for object model. So, Flatten() must be used before passing the object model as in code and it works!

Thankyou!

def linear_model_combined(optimizer='Adadelta'):
    
    modela_in = Input(shape=(100,34))
    modela_inf = Flatten()(modela_in)
    modela_out1 = Dense(1024,activation='relu',name='layer_a1')(modela_inf)
    modela_out2 = Dense(512,activation='relu',name='layer_a2')(modela_out1)
    modela = Model(modela_in,modela_out2)
    
    modelb_in = Input(shape=(100,34))
    modelb_inf = Flatten()(modelb_in)
    modelb_out1 = Dense(1024,activation='relu',name='layer_b1')(modelb_inf)
    modelb_out2 = Dense(512,activation='relu',name='layer_b2')(modelb_out1)
    modelb = Model(modelb_in,modelb_out2)
    
    modelconcat_in = concatenate([modela_out2,modelb_out2])
    modelconcat_out1 = Dense(256,activation='relu',name='layer_c1')(modelconcat_in)
    modelconcat_out = Dense(4,activation='softmax',name='layer_c2')(modelconcat_out1)
    
    model_merged = Model([modela_in,modelb_in], modelconcat_out)
    model_merged.compile(loss='categorical_crossentropy',optimizer=optimizer, metrics=['accuracy'])
    
    return model_merged

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM