Nếu bạn muốn đặt tốc độ học cụ thể cho các khoảng thời gian như thế nào 0 < a < b < c < ...
. Sau đó, bạn có thể xác định tốc độ học tập của mình dưới dạng một tensor có điều kiện, có điều kiện đối với bước tổng thể và cung cấp điều này như bình thường cho trình tối ưu hóa.
Bạn có thể đạt được điều này với một loạt các tf.cond
câu lệnh lồng nhau , nhưng việc xây dựng đệ quy tensor dễ dàng hơn:
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,)
)
Sau đó, để sử dụng nó, bạn cần biết có bao nhiêu bước đào tạo trong một kỷ nguyên, để chúng ta có thể sử dụng bước toàn cục để chuyển đổi vào đúng thời điểm, và cuối cùng xác định các kỷ nguyên và tốc độ học mà bạn muốn. Vì vậy, nếu tôi muốn tốc độ học tập [0.1, 0.01, 0.001, 0.0001]
trong các khoảng thời gian [0, 19], [20, 59], [60, 99], [100, \infty]
tương ứng, tôi sẽ là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