我之前使用过 Scikit-learn 的 GridSearchCV 来优化我的模型的超参数,但只是想知道是否存在类似的工具来优化 Tensorflow 的超参数(例如时期数、学习率、滑动窗口大小等)
如果没有,我如何实现一个有效运行所有不同组合的片段?
我之前使用过 Scikit-learn 的 GridSearchCV 来优化我的模型的超参数,但只是想知道是否存在类似的工具来优化 Tensorflow 的超参数(例如时期数、学习率、滑动窗口大小等)
如果没有,我如何实现一个有效运行所有不同组合的片段?
尽管它似乎没有明确记录(在 1.2 版中),但该包tf.contrib.learn
(包含在 TensorFlow 中)定义了应该与 scikit-learn 兼容的分类器......但是,查看源代码,您似乎需要显式设置环境变量TENSORFLOW_SKLEARN
(例如 to "1"
)以实际获得这种兼容性。如果可行,您已经可以使用GridSearchCV
(请参阅此测试用例)。
也就是说,有几种选择。我不知道任何特定于 TensorFlow 的信息,但hyperopt、Scikit-Optimize或SMAC3都应该是有效的选项。MOE和Spearmint看起来曾经是不错的选择,但现在似乎不太维护。
或者,您可以查看SigOpt(MOE 原作者的公司)之类的服务。
编辑
关于运行所有可能的参数组合,核心逻辑,如果你想自己实现,其实并不复杂。您可以使用每个参数的可能值定义列表,然后使用itertools.product
. 就像是:
from itertools import product
param1_values = [...]
param2_values = [...]
param3_values = [...]
for param1, param2, param3 in product(param1_values, param2_values param3_values):
run_experiment(param1, param2, param3)
但是请注意,网格搜索在许多情况下运行起来可能会非常昂贵,即使只是在参数空间中进行随机搜索也可能会更有效(有关此内容的更多信息,请参阅本出版物)。
使用 Tensorflow 进行网格搜索的另一个可行(且已记录)选项是Ray Tune。它是一个可扩展的超参数调整框架,特别适用于深度学习/强化学习。
您可以在此处试用快速教程。
它还在大约 10 行 Python 代码中处理了 Tensorboard 日志记录和高效搜索算法(即HyperOpt
集成和HyperBand )。
from ray import tune
def train_tf_model(config):
for i in range(num_epochs):
accuracy = train_one_epoch(model)
tune.report(acc=accuracy)
tune.run(train_tf_model,
config={
"alpha": tune.grid_search([0.2, 0.4, 0.6]),
"beta": tune.grid_search([1, 2]),
})
(免责声明:我为这个项目做出了积极的贡献!)