0

The following is my original MLP model:

def create_model(n_hidden_1, n_hidden_2, num_classes, num_features):
    # create the model
    model = Sequential()
    model.add(tf.keras.layers.InputLayer(input_shape=(num_features,)))
    model.add(tf.keras.layers.Dense(n_hidden_1, activation='sigmoid'))
    model.add(tf.keras.layers.Dense(n_hidden_2, activation='sigmoid'))
    model.add(tf.keras.layers.Dense(num_classes, activation='softmax'))
    # instantiate the optimizer
    opt = keras.optimizers.SGD(learning_rate=LEARNING_RATE)
    # compile the model
    model.compile(
        optimizer=opt,
        loss="categorical_crossentropy",
        metrics="categorical_accuracy"
    )
    # return model
    return model

In order to tune it, I implemented a Keras-Tuner model as follows:

def _model(hp, num_features, num_classes):
    model = keras.Sequential()
    model.add(tf.keras.layers.InputLayer(input_shape=(num_features)))
    model.add(tf.keras.layers.Dense(
            hp.Int("dense_1_units", min_value=128, max_value=2048, step=128, default=128),
            activation="sigmoid"
        ))
    model.add(tf.keras.layers.Dense(
        hp.Int("dense_2_units", min_value=128, max_value=2048, step=128, default=128),
        activation="sigmoid"
    ))
    model.add(tf.keras.layers.Dense(num_classes, activation="softmax"))

    model.compile(
        optimizer=tf.keras.optimizers.Adam(
            hp.Choice("learning_rate", values=[1e-1, 1e-2, 1e-3])
        ),
        loss="categorical_crossentropy",
        metrics="categorical_accuracy"
    )

    return model

And, the call was like the following:

tuner = RandomSearch(
    _model(FEATURES_COUNT, CLASS_COUNT),
    objective="categorical_accuracy",
    max_trials=10,
    overwrite=True,
    directory="my_project",
    project_name="my_project",
)

However, it is generating the following error:

Traceback (most recent call last):
  File "C:\Users\pc\source\repos\my_project\my_tuner.py", line 219, in <module>
    _model(FEATURES_COUNT, CLASS_COUNT),
TypeError: _model() missing 1 required positional argument: 'num_classes'

How can I pass the values of num_features and num_classes into the tuner-model?

user366312
  • 16,949
  • 65
  • 235
  • 452

1 Answers1

0

For the num_classes , as mentioned in the documentation.

It can be passed like this :

class MyHyperModel(HyperModel):
    def __init__(self, classes):
        self.classes = classes

def build(self, hp):
    model = keras.Sequential()
    model.add(layers.Flatten())
    model.add(
        layers.Dense(
            units=hp.Int("units", min_value=32, max_value=512, step=32),
            activation="relu",
        )
    )
    model.add(layers.Dense(self.classes, activation="softmax"))
    model.compile(
        optimizer=keras.optimizers.Adam(
            hp.Choice("learning_rate", values=[1e-2, 1e-3, 1e-4])
        ),
        loss="categorical_crossentropy",
        metrics=["accuracy"],
    )
    return model

hypermodel = MyHyperModel(classes=10)

tuner = RandomSearch(
    hypermodel,
    objective="val_accuracy",
    max_trials=3,
    overwrite=True,
    directory="my_dir",
    project_name="helloworld",
)

tuner.search(x_train, y_train, epochs=2, validation_data=(x_val, y_val))

https://keras.io/guides/keras_tuner/getting_started/

abdou_dev
  • 805
  • 1
  • 10
  • 28