В `tf.estimator`, как` tf.assign` для переменной в конце обучения (не на каждой итерации)? - PullRequest
0 голосов
/ 18 мая 2018

Я использую tf.estimator API для обучения моделей.

Как я понимаю, model_fn определяет график вычислений, который возвращает tf.estimator.EstimatorSpec в соответствии с mode.

В mode==tf.estimator.ModeKeys.TRAIN можно указать train_op, который будет вызываться на каждой обучающей итерации, что в свою очередь изменяет trainable экземпляров tf.Variable, чтобы оптимизировать определенную потерю.

Давайте назовем train_op optimizer, а переменные A и B.

Чтобы ускорить прогнозирование и оценку, я хотел бы иметьвспомогательный необучаемый tf.Variable Тензор C, исключительно зависящий от уже обученных переменных.Значения этого тензора, таким образом, будут экспортируемыми.Этот Тензор не влияет на потерю тренировки.Давайте предположим, что мы хотим:

C = tf.Variable(tf.matmul(A,B))
update_op = tf.assign(C, tf.matmul(A,B))
  • Что я пробовал:

Передача tf.group(optimizer, update_op) как train_op в EstimatorSpec работает хорошо, но медленномного тренировок вниз , так как train_op теперь обновляет C на каждой итерации.

Поскольку C требуется только во время оценки / прогнозирования, один вызов update_op в концеобучения достаточно.

Можно ли назначить переменную в конце обучения a tf.estimator.Estimator?

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Использование крючка - это решение.Но обратите внимание, что если вы хотите изменить значение переменных, вы не должны вносить изменения в функцию end (), поскольку результаты изменения не могут быть сохранены в файле контрольных точек.Если вы измените значение, например, в функции after_run, результаты будут сохранены в контрольной точке.

0 голосов
/ 18 мая 2018

В общем, одна итерация функции модели не знает, закончится ли обучение после того, как оно начнется, поэтому я сомневаюсь, что это можно сделать прямо.Я вижу два варианта:

  1. Если вам нужна вспомогательная переменная только после обучения, вы можете использовать tf.estimator.Estimator.get_variable_value (см. здесь ), чтобы извлечь значения переменных A и B после тренировки в виде массивов и сделайте свои вычисления, чтобы получить C.Однако тогда C не будет частью модели.

  2. Используйте крючок (см. здесь ).Вы можете написать ловушку с помощью метода end, который будет вызываться в конце сеанса (т. Е. Когда тренировка прекращается).Вам, вероятно, нужно посмотреть, как определяются / используются ловушки - например, здесь вы можете найти реализации большинства "базовых" ловушек уже в Tensorflow.Грубый скелет может выглядеть примерно так:

    class UpdateHook(SessionRunHook):
        def __init__(update_variable, other_variables):
            self.update_op = tf.assign(update_variable, some_fn(other_variables))
    
        def end(session):
            session.run(self.update_op)
    

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

    Я не проверял это!Я не уверен, что вы можете определить ops внутри крючка.Если нет, то, надеюсь, стоит поработать над определением операции обновления внутри функции модели и передать ее непосредственно в ловушку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...