import tensorflow as tf
from tensorflow.keras import layers, models
# Shared backbone
inputs = tf.keras.Input(shape=(128, 128, 3))
base_model = tf.keras.applications.MobileNetV2(input_tensor=inputs, include_top=False, weights=None)
# Semantic segmentation head
x_sem = layers.Conv2D(64, 3, padding='same', activation='relu')(base_model.output)
x_sem = layers.UpSampling2D(size=(32,32))(x_sem)
semantic_output = layers.Conv2D(3, 1, activation='softmax', name='semantic_output')(x_sem)
# Instance segmentation head
x_inst = layers.Conv2D(64, 3, padding='same', activation='relu')(base_model.output)
x_inst = layers.UpSampling2D(size=(32,32))(x_inst)
instance_output = layers.Conv2D(1, 1, activation='sigmoid', name='instance_output')(x_inst)
# Model with two outputs
model = models.Model(inputs=inputs, outputs=[semantic_output, instance_output])
model.compile(optimizer='adam',
loss={'semantic_output': 'categorical_crossentropy', 'instance_output': 'binary_crossentropy'},
metrics={'semantic_output': 'accuracy', 'instance_output': 'accuracy'})
# Dummy data for demonstration
import numpy as np
X_train = np.random.rand(100, 128, 128, 3).astype('float32')
y_sem_train = tf.keras.utils.to_categorical(np.random.randint(3, size=(100, 128, 128)), num_classes=3)
y_inst_train = np.random.randint(2, size=(100, 128, 128, 1))
# Train model
model.fit(X_train, {'semantic_output': y_sem_train, 'instance_output': y_inst_train}, epochs=5, batch_size=8, validation_split=0.2)