Wenn Sie bestimmte Lernraten für Intervalle von Epochen wie einstellen möchten 0 < a < b < c < ...
. Anschließend können Sie Ihre Lernrate als bedingten Tensor definieren, der vom globalen Schritt abhängig ist, und diesen wie gewohnt dem Optimierer zuführen.
Sie könnten dies mit einer Reihe verschachtelter tf.cond
Anweisungen erreichen, aber es ist einfacher, den Tensor rekursiv zu erstellen:
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,)
)
Um es dann verwenden zu können, müssen Sie wissen, wie viele Trainingsschritte es in einer einzelnen Epoche gibt, damit wir den globalen Schritt verwenden können, um zum richtigen Zeitpunkt zu wechseln und schließlich die gewünschten Epochen und Lernraten zu definieren. Wenn ich also die Lernraten [0.1, 0.01, 0.001, 0.0001]
während der Epochenintervalle von [0, 19], [20, 59], [60, 99], [100, \infty]
jeweils möchte, würde ich tun:
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