import tensorflow as tf
from tensorflow.keras import layers, models, Input
# Numeric input branch
numeric_input = Input(shape=(10,), name='numeric_input')
x1 = layers.Dense(64, activation='relu')(numeric_input)
x1 = layers.Dropout(0.3)(x1)
x1 = layers.Dense(32, activation='relu')(x1)
# Image input branch
image_input = Input(shape=(28, 28, 1), name='image_input')
x2 = layers.Conv2D(32, (3,3), activation='relu')(image_input)
x2 = layers.MaxPooling2D((2,2))(x2)
x2 = layers.Conv2D(64, (3,3), activation='relu')(x2)
x2 = layers.MaxPooling2D((2,2))(x2)
x2 = layers.Flatten()(x2)
x2 = layers.Dropout(0.3)(x2)
x2 = layers.Dense(64, activation='relu')(x2)
# Combine branches
combined = layers.concatenate([x1, x2])
# Output 1: Regression
regression_output = layers.Dense(1, activation='linear', name='regression_output')(combined)
# Output 2: Classification (3 classes)
classification_output = layers.Dense(3, activation='softmax', name='classification_output')(combined)
# Define model
model = models.Model(inputs=[numeric_input, image_input], outputs=[regression_output, classification_output])
# Compile model with weighted losses
model.compile(optimizer='adam',
loss={'regression_output': 'mse', 'classification_output': 'sparse_categorical_crossentropy'},
loss_weights={'regression_output': 1.0, 'classification_output': 1.0},
metrics={'regression_output': 'mse', 'classification_output': 'accuracy'})
# Example dummy data for demonstration
import numpy as np
X_numeric = np.random.rand(1000, 10).astype('float32')
X_image = np.random.rand(1000, 28, 28, 1).astype('float32')
y_regression = np.random.rand(1000, 1).astype('float32')
y_classification = np.random.randint(0, 3, 1000)
# Train model
history = model.fit(
{'numeric_input': X_numeric, 'image_input': X_image},
{'regression_output': y_regression, 'classification_output': y_classification},
epochs=20,
batch_size=32,
validation_split=0.2
)