Gibi çağ aralıkları için belirli öğrenme oranları ayarlamak istiyorsanız 0 < a < b < c < ...
. Daha sonra, öğrenme oranınızı koşullu bir tensör olarak tanımlayabilir, küresel adıma bağlı olarak tanımlayabilir ve bunu normal bir şekilde iyileştiriciye besleyebilirsiniz.
Bunu bir dizi iç içe geçmiş tf.cond
ifadeyle elde edebilirsiniz, ancak tensörü yinelemeli olarak oluşturmak daha kolaydır:
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,)
)
Daha sonra bunu kullanmak için tek bir çağda kaç eğitim adımı olduğunu bilmeniz gerekir, böylece doğru zamanda geçiş yapmak için global adımı kullanabilir ve sonunda istediğiniz çağları ve öğrenme oranlarını tanımlayabiliriz. Dolayısıyla [0.1, 0.01, 0.001, 0.0001]
, [0, 19], [20, 59], [60, 99], [100, \infty]
sırasıyla dönem aralıklarındaki öğrenme oranlarını istiyorsam , şunu yapardım:
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