0

以下是我原来的 MLP 模型:

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

为了调整它,我实现了一个 Keras-Tuner 模型,如下所示:

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

而且,电话是这样的:

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

但是,它正在生成以下错误:

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'

如何将num_features和的值传递num_classes到调谐器模型中?

4

1 回答 1

0

对于num_classes, 如文档中所述。

它可以像这样传递:

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/

于 2021-10-17T01:00:45.970 回答