0

我不确定我是否可以使用新的超参数正确调整我的模型。前两个代码块解释了构建,最后一个块是我质疑模型的地方。

我创建了一个模型来设置超参数搜索空间,如下所示:

def build_model(hp):
    """
    Builds model and sets up hyperparameter space to search.
    
    Parameters
    ----------
    hp : HyperParameter object
        Configures hyperparameters to tune.
        
    Returns
    -------
    model : keras model
        Compiled model with hyperparameters to tune.
    """
    inputs = Input(shape=(height, width, 3))
    x = img_augmentation(inputs)
    model = EfficientNetB4(
        include_top=False, input_tensor=x, weights="imagenet")

    # Freeze the pretrained weights
    model.trainable = False

    # Rebuild top
    x = layers.GlobalAveragePooling2D(name="avg_pool")(model.output)
    x = layers.BatchNormalization()(x)

    top_dropout_rate = hp.Float(min_value=0.1, max_value=0.9 ,step=0.1, name="top_dropout")
    x = layers.Dropout(top_dropout_rate)(x)
    outputs = layers.Dense(3, activation="softmax", name="pred")(x)

    # Compile
    model = tf.keras.Model(inputs, outputs, name="EfficientNet")
    hp_learning_rate = hp.Choice("learning_rate", values=[1e-1, 1e-2, 1e-3, 1e-4])
    optimizer = tf.keras.optimizers.Adam(hp_learning_rate)
    model.compile(
        optimizer=optimizer, loss="categorical_crossentropy", metrics=["accuracy"]
    )
    return model

然后我调整模型以获得最佳超参数:

# Hyperparamter Tuning
tuner = kt.Hyperband(
    build_model,
    objective='val_accuracy',
    max_epochs=epochs,
    hyperband_iterations=10,
    seed=42,
    directory=".\models",
    project_name="Tuned Models",
    )

tuner.search(train_ds,
             validation_data=val_ds,
             epochs=epochs,
             callbacks=[callback],
             verbose=1
             )

best_model = tuner.get_best_models(1)[0]
best_hyperparameters = tuner.get_best_hyperparameters()[0]

这是我不确定我是否通过了正确的模型的地方。我正在解冻 tune_model.layers,但我不知道我是否应该只通过 model.layers。当我两者都完成时,我得到了类似的验证准确性,所以我无法判断一种方法或另一种方法是否正确。

# Retrain model with best hyperparameters
tuned_model = tuner.hypermodel.build(best_hyperparameters)
hist = tuned_model.fit(train_ds, epochs=epochs, validation_data=val_ds,
                 workers=6, verbose=1, callbacks=callback)
plot_hist(hist)

def unfreeze_model(model):
    # We unfreeze the top 20 layers while leaving BatchNorm layers frozen
    for layer in tuned_model.layers[-20:]:
        if not isinstance(layer, layers.BatchNormalization):
            layer.trainable = True

    optimizer = tf.keras.optimizers.Adam(learning_rate=1e-4)
    model.compile(
        optimizer=optimizer, loss="categorical_crossentropy", metrics=["accuracy"]
    )


unfreeze_model(tuned_model)


hist = tuned_model.fit(train_ds, epochs=epochs, validation_data=val_ds,
                 workers=6, verbose=1, callbacks=callback)
4

0 回答 0