Si desea establecer tasas de aprendizaje específicas para intervalos de épocas como 0 < a < b < c < ...
. Luego, puede definir su tasa de aprendizaje como un tensor condicional, condicional en el paso global, y alimentar esto de forma normal al optimizador.
Puede lograr esto con un montón de tf.cond
declaraciones anidadas , pero es más fácil construir el tensor de forma recursiva:
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,)
)
Luego, para usarlo, debe saber cuántos pasos de entrenamiento hay en una sola época, de modo que podamos usar el paso global para cambiar en el momento adecuado y, finalmente, definir las épocas y las tasas de aprendizaje que desee. Entonces, si quiero las tasas de aprendizaje [0.1, 0.01, 0.001, 0.0001]
durante los intervalos de época de [0, 19], [20, 59], [60, 99], [100, \infty]
respectivamente, haría:
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