Search code examples
machine-learningkerasdeep-learningconv-neural-network

I want to concatenate these two models


I am trying to concatenate the following two models:

input_layer = Input(shape=(227,227,3))
model1 = Sequential([
    Conv2D(20, kernel_size=(5,5), activation='relu' ),
    MaxPooling2D((2,2)),
    Conv2D(30, kernel_size=(3,3), activation='relu'),
    MaxPooling2D((2,2)),
    Conv2D(40, kernel_size=(3,3), activation='relu'),
    MaxPooling2D((2,2)),
    Conv2D(50, kernel_size=(3,3), activation='relu'),
    MaxPooling2D((2,2)),
    Conv2D(60, kernel_size=(3,3), activation='relu'),
    MaxPooling2D((2,2)),
    
])(input_layer)

model2 = Sequential([
    Conv2D(20, kernel_size=(5,5), activation='relu', dilation_rate=(3)),
    MaxPooling2D((2,2)),
    Conv2D(30, kernel_size=(3,3), activation='relu', dilation_rate=(2)),
    MaxPooling2D((2,2)),
    Conv2D(40, kernel_size=(3,3), activation='relu', dilation_rate=(2)),
    MaxPooling2D((2,2)),
    Conv2D(50, kernel_size=(3,3), activation='relu', dilation_rate=(1)),
    MaxPooling2D((2,2)),
    Conv2D(60, kernel_size=(3,3), activation='relu', dilation_rate=(1)),
    MaxPooling2D((2,2)),
])(input_layer)

merged_model = Concatenate()([model1, model2])
merged_model = Flatten()(merged_model)
merged_model = Dense(1024, activation='relu')(merged_model)
merged_model = Dense(4, activation='softmax')(merged_model)`

but it's showing an error:

A Concatenate layer requires inputs with matching shapes except for the concatenation axis. Received: input_shape=[(None, 5, 5, 60), (None, 4, 4, 60)]

I tried ChatGPT and it is asking me to use Flatten function and flatten model 2 but then it will convert to KerasTensor and that won't compile. I need suggestions on how to fix this or how to change the dilation rate so that both the input shapes become the same. Chat GPT gave me this approach:`

model1 = Sequential([
    Conv2D(20, kernel_size=(5,5), activation='relu' ),
    MaxPooling2D((2,2)),
    Conv2D(30, kernel_size=(3,3), activation='relu'),
    MaxPooling2D((2,2)),
    Conv2D(40, kernel_size=(3,3), activation='relu'),
    MaxPooling2D((2,2)),
    Conv2D(50, kernel_size=(3,3), activation='relu'),
    MaxPooling2D((2,2)),
    Conv2D(60, kernel_size=(3,3), activation='relu'),
    MaxPooling2D((2,2)),  
])(input_layer)

model2 = Sequential([
    Conv2D(20, kernel_size=(5,5), activation='relu', dilation_rate=(3)),
    MaxPooling2D((2,2)),
    Conv2D(30, kernel_size=(3,3), activation='relu', dilation_rate=(2)),
    MaxPooling2D((2,2)),
    Conv2D(40, kernel_size=(3,3), activation='relu', dilation_rate=(2)),
    MaxPooling2D((2,2)),
    Conv2D(50, kernel_size=(3,3), activation='relu', dilation_rate=(1)),
    MaxPooling2D((2,2)),
    Conv2D(60, kernel_size=(3,3), activation='relu', dilation_rate=(1)),
    MaxPooling2D((2,2)),
])(input_layer)

model1 = Flatten()(model1)
model2 = Flatten()(model2)

merged_model = Concatenate()([model1, model2])
merged_model = Dense(1024, activation='relu')(merged_model)
merged_model = Dense(4, activation='softmax')(merged_model)`

Solution

  • I compiled it without any problem. Here is the code:

    import tensorflow as tf
    from tensorflow.keras import layers
    from tensorflow import keras
    
    input_layer = layers.Input(shape=(227,227,3))
    input_layer = layers.Input(shape=(227,227,3))
    model1_out = keras.Sequential([
        layers.Conv2D(20, kernel_size=(5,5), activation='relu' ),
        layers.MaxPooling2D((2,2)),
        layers.Conv2D(30, kernel_size=(3,3), activation='relu'),
        layers.MaxPooling2D((2,2)),
        layers.Conv2D(40, kernel_size=(3,3), activation='relu'),
        layers.MaxPooling2D((2,2)),
        layers.Conv2D(50, kernel_size=(3,3), activation='relu'),
        layers.MaxPooling2D((2,2)),
        layers.Conv2D(60, kernel_size=(3,3), activation='relu'),
        layers.MaxPooling2D((2,2)),  
    ])(input_layer)
    
    model2_out = keras.Sequential([
        layers.Conv2D(20, kernel_size=(5,5), activation='relu', dilation_rate=(3)),
        layers.MaxPooling2D((2,2)),
        layers.Conv2D(30, kernel_size=(3,3), activation='relu', dilation_rate=(2)),
        layers.MaxPooling2D((2,2)),
        layers.Conv2D(40, kernel_size=(3,3), activation='relu', dilation_rate=(2)),
        layers.MaxPooling2D((2,2)),
        layers.Conv2D(50, kernel_size=(3,3), activation='relu', dilation_rate=(1)),
        layers.MaxPooling2D((2,2)),
        layers.Conv2D(60, kernel_size=(3,3), activation='relu', dilation_rate=(1)),
        layers.MaxPooling2D((2,2)),
    ])(input_layer)
    
    model1_out = layers.Flatten()(model1_out)
    model2_out = layers.Flatten()(model2_out)
    
    merged_out = layers.Concatenate()([model1_out, model2_out])
    merged_out = layers.Dense(1024, activation='relu')(merged_out)
    merged_out = layers.Dense(4, activation='softmax')(merged_out)
    
    model = keras.Model(input_layer, merged_out)
    model.compile(optimizer="adam", loss="sparse_categorical_crossentropy")