在搜索了超参数之后,我尝试了两种方法来获得最佳模型。
一种方法是使用tuner.get_best_hyperparameters()生成模型,如代码片段"A“所示。
另一个是直接使用tuner.get_best_models(),如代码片段"B“中所示。
然后用这两种模型对相同的数据进行预测,预测结果相差很大。
为什么?这两种型号有什么区别?
答:
tuner.search(x_train, y_train)
best_hps=tuner.get_best_hyperparameters(1)[0]
best_model_params = build_model(best_hps)
best_model_params.fit(X, Y)
best_model_params.save("best_model_params_2")B:
tuner.search(x_train, y_train)
models = tuner.get_best_models(num_models=1)
best_model = models[0]
best_model.fit(X, Y)
best_model.save("best_model_2")发布于 2022-07-26 13:12:12
这不是一个明确的答案,因为我不确定这里的区别,但它是基于官方文档和教程。从卡拉斯调谐器“开始”和关于角调器的PyImageSearch教程,两者都使用选项A。
例如,在官方的keras-tuner教程中,搜索数据子集上的参数,并对最终模型进行如下培训:
# Get the top 2 hyperparameters.
best_hps = tuner.get_best_hyperparameters(2)
# Build the model with the best hp.
model = build_model(best_hps[0])
# Fit with the entire dataset.
x_all = np.concatenate((x_train, x_val))
y_all = np.concatenate((y_train, y_val))
model.fit(x=x_all, y=y_all, epochs=1)在PyImageSearch教程中,它们执行以下操作:
# build the best model and train it
model = tuner.hypermodel.build(bestHP)
H = model.fit(x=trainX, y=trainY,
validation_data=(testX, testY), batch_size=config.BS,
epochs=config.EPOCHS, callbacks=[es], verbose=1)
# evaluate the network
predictions = model.predict(x=testX, batch_size=32)
...有趣的是,在后面,它们直接从调谐器类中使用tuner.hypermodel.build,而调谐器类仅在API文档中显示。
令人困惑的是,最好的发现是受过训练的还是未经训练的。模型未经训练,如keras-tuner文档所示,它显示了get_best_hyperparameters方法的以下示例:
返回由目标确定的最佳超参数。 该方法可用于恢复搜索过程中发现的(未经过训练的)最佳模型。 示例
best_hp = tuner.get_best_hyperparameters()[0]
model = tuner.hypermodel.build(best_hp)然而,在get_best_models 文档上,它说它返回了“从最好到最坏的训练的模型实例列表”,但是
为了获得最佳性能,建议使用搜索过程中发现的最佳超参数在完整的数据集上重新培训您的模型,这些参数可以使用tuner.get_best_hyperparameters()获得。模型加载与其最佳检查点对应的权重(在最佳试验的最佳时代结束时)。
https://stackoverflow.com/questions/72267435
复制相似问题