之前我使用过Scikit-learn的GridSearchCV来优化模型的超参数,但只是想知道是否存在类似的工具来优化Tensorflow的超参数(例如时代数,学习率,滑动窗口大小等)
如果没有,我如何实现有效运行所有不同组合的片段?
答案 0 :(得分:17)
即使它似乎没有明确记录(在版本1.2中),包tf.contrib.learn
(包含在TensorFlow中)定义了应该与scikit-learn兼容的分类器......但是,查看the source,您似乎需要明确设置环境变量TENSORFLOW_SKLEARN
(例如"1"
)以实际获得此兼容性。如果此方法有效,您可以使用GridSearchCV
(see this test case)。
尽管如此,还是有一些选择。我不知道任何特定的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)
但请注意,在许多情况下,网格搜索的运行成本过高,甚至在参数空间中进行随机搜索可能会更有效(更多关于in this publication)。
答案 1 :(得分:12)
使用Tensorflow进行网格搜索的另一个可行(并且已记录)选项是Ray Tune。它是超参数调整的可扩展框架,专门用于深度学习/强化学习。
您可以试用a fast tutorial here。
它还在大约10行Python中处理Tensorboard日志记录和高效搜索算法(即HyperOpt
集成和HyperBand)。
import ray
from ray import tune
def train_tf_model(config, tune_reporter): # 1 new arg for reporting results
# ... train here ....
# ... train here ....
# ... train here ....
pass
ray.init()
tune.run(train_tf_model,
stop={ "mean_accuracy": 100 },
config={
"alpha": tune.grid_search([0.2, 0.4, 0.6]),
"beta": tune.grid_search([1, 2]),
})
(免责声明:我积极参与这个项目!)