Si vous souhaitez définir des taux d'apprentissage spécifiques pour des intervalles d'époques comme 0 < a < b < c < ...
. Ensuite, vous pouvez définir votre taux d'apprentissage comme un tenseur conditionnel, conditionnel à l'étape globale, et le fournir normalement à l'optimiseur.
Vous pouvez y parvenir avec un tas d' tf.cond
instructions imbriquées , mais il est plus facile de construire le tenseur de manière récursive:
def make_learning_rate_tensor(reduction_steps, learning_rates, global_step):
assert len(reduction_steps) + 1 == len(learning_rates)
if len(reduction_steps) == 1:
return tf.cond(
global_step < reduction_steps[0],
lambda: learning_rates[0],
lambda: learning_rates[1]
)
else:
return tf.cond(
global_step < reduction_steps[0],
lambda: learning_rates[0],
lambda: make_learning_rate_tensor(
reduction_steps[1:],
learning_rates[1:],
global_step,)
)
Ensuite, pour l'utiliser, vous devez savoir combien d'étapes d'entraînement il y a dans une seule époque, afin que nous puissions utiliser l'étape globale pour basculer au bon moment, et enfin définir les époques et les taux d'apprentissage que vous souhaitez. Donc, si je veux les taux d'apprentissage [0.1, 0.01, 0.001, 0.0001]
pendant les intervalles d'époque de [0, 19], [20, 59], [60, 99], [100, \infty]
respectivement, je ferais:
global_step = tf.train.get_or_create_global_step()
learning_rates = [0.1, 0.01, 0.001, 0.0001]
steps_per_epoch = 225
epochs_to_switch_at = [20, 60, 100]
epochs_to_switch_at = [x*steps_per_epoch for x in epochs_to_switch_at ]
learning_rate = make_learning_rate_tensor(epochs_to_switch_at , learning_rates, global_step)
FailedPreconditionError (see above for traceback): Attempting to use uninitialized value beta2_power