import keras
import numpy as np
import pandas as pd
# Define custom model with serialization support
@keras.saving.register_keras_serializable()
class BinaryClassifier(keras.Model):
def __init__(self, hidden_units: int, output_units: int) -> None:
super().__init__()
self.dense1 = keras.layers.Dense(hidden_units, activation="relu")
self.dense2 = keras.layers.Dense(output_units, activation="sigmoid")
def call(self, inputs):
x = self.dense1(inputs)
return self.dense2(x)
def get_config(self):
base_config = super().get_config()
config = {
"dense1": keras.saving.serialize_keras_object(self.dense1),
"dense2": keras.saving.serialize_keras_object(self.dense2),
}
return {**base_config, **config}
@classmethod
def from_config(cls, config):
dense1_config = config.pop("dense1")
dense1 = keras.saving.deserialize_keras_object(dense1_config)
dense2_config = config.pop("dense2")
dense2 = keras.saving.deserialize_keras_object(dense2_config)
obj = cls(1, 1)
obj.dense1 = dense1
obj.dense2 = dense2
return obj
# Create sample data
n_samples, n_features = 100, 10
X = pd.DataFrame(
np.random.rand(n_samples, n_features),
columns=[f"feature_{i}" for i in range(n_features)]
)
y = np.random.randint(0, 2, n_samples).astype(np.float32)
# Create and train model
model = BinaryClassifier(hidden_units=32, output_units=1)
model.compile(
optimizer=keras.optimizers.SGD(learning_rate=0.01),
loss=keras.losses.MeanSquaredError()
)
model.fit(X, y, epochs=10, verbose=0)
# Log the model
model_ref = reg.log_model(
model=model,
model_name="my_custom_classifier",
version_name="v1",
sample_input_data=X,
)
# Make predictions
result_df = model_ref.run(X[-10:], function_name="predict")