我不确定我是否可以使用新的超参数正确调整我的模型。前两个代码块解释了构建,最后一个块是我质疑模型的地方。
我创建了一个模型来设置超参数搜索空间,如下所示:
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)