Я пытаюсь обновлять вес каждую эпоху, но обрабатываю данные партиями. Проблема в том, что для нормализации потерь мне нужно записать переменные TensorFlow вне цикла обучения (чтобы их можно было отслеживать и нормализовать). Но когда я это делаю, время на тренировки Огромное.
Я думаю, он накапливает переменные из всех партий в график и вычисляет градиенты в конце.
Я начал отслеживать переменные вне цикла for и внутри цикла for, и последнее выполняется быстрее, чем первое. Я не понимаю, почему это происходит, потому что, что бы я ни делал, обучаемые переменные моей модели и потери остаются прежними.
# Very Slow
loss_value = 0
batches = 0
with tf.GradientTape() as tape:
for inputs, min_seq in zip(dataset, minutes_sequence):
temp_loss_value = my_loss_function(inputs, min_seq)
batches +=1
loss_value = loss_value + temp_loss_value
# The following line takes huge time.
grads = tape.gradient(loss_value, model.trainable_variables)
# Very Fast
loss_value = 0
batches = 0
for inputs, min_seq in zip(dataset, minutes_sequence):
with tf.GradientTape() as tape:
temp_loss_value = my_loss_function(inputs, min_seq)
batches +=1
loss_value = loss_value + temp_loss_value
# If I do the following line, the graph will break because this are out of tape's scope.
loss_value = loss_value / batches
# the following line takes huge time
grads = tape.gradient(loss_value, model.trainable_variables)
Когда я объявляю tf.GradientTape () внутри цикла for, он выполняется очень быстро, а снаружи - медленно.
P.S. - Это для нестандартной потери, а архитектура содержит только один скрытый слой размером 10.
Я хочу знать, в чем разница между положением tf.GradientTape () и тем, как его следует использовать для обновления весов для каждой эпохи в пакетном наборе данных.