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)

Обратите внимание, однако, что поиск по сетке во многих случаях может быть чрезмерно дорогостоящим, и даже выполнение случайного поиска в пространстве параметров, вероятно, будет более эффективным (подробнее об этом в этой публикации).