jk12
jk12

Reputation: 1

Channel-wise multiplication of metadata with intermediate layers

I am writing a code for Channel-wise multiplication of metadata with intermediate layers as mentioned in this paper https://link.springer.com/chapter/10.1007/978-3-030-59713-9_24.

Here are my code: def process_metadata(metadata_input, output_dim): x = Dense(output_dim, activation='relu')(metadata_input) return x

class MultiplyMetadata(tf.keras.layers.Layer): def init(self, block_channels, **kwargs): super(MultiplyMetadata, self).init(**kwargs) self.block_channels = block_channels self.dense = Dense(block_channels, activation='relu')

def call(self, inputs):
    block_output, metadata_processed = inputs
    metadata_reshaped = Reshape((1, 1, self.block_channels))(self.dense(metadata_processed))
    metadata_repeated = tf.tile(metadata_reshaped, [1, tf.shape(block_output)[1], tf.shape(block_output)[2], 1])
    
    metadata_padded = tf.pad(metadata_repeated, [[0, 0], [0, 0], [0, 0], [0, tf.shape(block_output)[-1] - self.block_channels]])
    multiplied_output = Multiply()([block_output, metadata_padded])
    return multiplied_output

def create_model(input_shape, metadata_shape, num_classes): img_input = Input(shape=input_shape) metadata_input = Input(shape=metadata_shape)

base_model = DenseNet169(weights='imagenet', include_top=False, input_tensor=img_input)

block_1_output = base_model.get_layer('pool1').output
block_2_output = base_model.get_layer('pool2_pool').output
block_3_output = base_model.get_layer('pool3_pool').output
block_4_output = base_model.get_layer('pool4_pool').output

metadata_processed_1 = process_metadata(metadata_input, 64)
metadata_processed_2 = process_metadata(metadata_processed_1, 128)
metadata_processed_3 = process_metadata(metadata_processed_2, 256)
metadata_processed_4 = process_metadata(metadata_processed_3, 512)

block_1_multiplied = MultiplyMetadata(64)([block_1_output, metadata_processed_1])
block_2_multiplied = MultiplyMetadata(128)([block_2_output, metadata_processed_2])
block_3_multiplied = MultiplyMetadata(256)([block_3_output, metadata_processed_3])
block_4_multiplied = MultiplyMetadata(512)([block_4_output, metadata_processed_4])

# ensuring t the flow through the base_model layers
x = base_model.input
for layer in base_model.layers[1:7]:
    x = layer(x)
x = block_1_multiplied
for layer in base_model.layers[7:53]:
    x = layer(x)
x = block_2_multiplied
for layer in base_model.layers[53:141]:
    x = layer(x)
x = block_3_multiplied
for layer in base_model.layers[141:]:
    x = layer(x)
x = block_4_multiplied

gap = GlobalAveragePooling2D()(x)
dense_1 = Dense(256, activation='relu')(gap)
dense_2 = Dense(128, activation='relu')(dense_1)
output = Dense(num_classes, activation='softmax')(dense_2)

model = Model(inputs=[img_input, metadata_input], outputs=output)
return model

And the error: Traceback (most recent call last):

File "C:\Users\admin\AppData\Local\Temp\ipykernel_21884\2510895107.py", line 82, in model = create_model(input_shape, metadata_shape, num_classes)

File "C:\Users\admin\AppData\Local\Temp\ipykernel_21884\2510895107.py", line 60, in create_model x = layer(x)

File "C:\Users\admin\AppData\Roaming\Python\Python37\site-packages\keras\utils\traceback_utils.py", line 70, in error_handler raise e.with_traceback(filtered_tb) from None

File "C:\Users\admin\AppData\Roaming\Python\Python37\site-packages\keras\layers\merging\base_merge.py", line 124, in call "A merge layer should be called on a list of inputs. "

ValueError: Exception encountered when calling layer "conv2_block1_concat" (type Concatenate).

A merge layer should be called on a list of inputs. Received: inputs=Tensor("Placeholder:0", shape=(None, 56, 56, 32), dtype=float32) (not a list of tensors)

Call arguments received by layer "conv2_block1_concat" (type Concatenate): • inputs=tf.Tensor(shape=(None, 56, 56, 32), dtype=float32)

It would be helpful if anyone can solve this error!!!!

Upvotes: 0

Views: 30

Answers (0)

Related Questions