Hyperparameter Tuning of Tensorflow Model
Я использовал Scikit-learn GridSearchCV прежде, чем оптимизировать гиперпараметры моих моделей, но просто интересно, существует ли подобный инструмент для оптимизации гиперпараметров для Tensorflow (например, количество эпох, скорость обучения, размер раздвижных окон и т.д..)
И если нет, как я могу реализовать фрагмент, который эффективно запускает все разные комбинации?
Ответы
Ответ 1
Еще одна жизнеспособная (и задокументированная) опция для поиска в сетке с Tensorflow - это Ray Tune. Это масштабируемая структура для настройки гиперпараметров, особенно для глубокого обучения/обучения с подкреплением.
Вы можете попробовать быстрый учебник здесь.
Он также заботится о ведении журнала Tensorboard и эффективных алгоритмах поиска (например, HyperOpt
интеграция и HyperBand) примерно в 10 строках Python.
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]),
})
(Отказ от ответственности: я активно участвую в этом проекте!)
Ответ 2
Несмотря на то, что он явно не документирован (в версии 1.2), пакет tf.contrib.learn
(входит в TensorFlow) определяет классификаторы которые должны быть совместимы с scikit-learn... Однако, глядя на источник, кажется, вам нужно явно указать переменную среды TENSORFLOW_SKLEARN
(например, до "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)
Обратите внимание, однако, что поиск по сетке во многих случаях может быть чрезмерно дорогостоящим, и даже выполнение случайного поиска в пространстве параметров, вероятно, будет более эффективным (подробнее об этом в этой публикации).