tf.GradientTape
записывает каждую операцию, которая происходит внутри его области.
Вы не хотите записывать на ленте вычисление градиента, вам нужно только рассчитать убыток вперед.
with tf.GradientTape() as tape:
# take binary cross-entropy (bce_loss)
current_loss = bce_loss(model(df), classification)
# End of tape scope
# Update weights based on the gradient of the loss function
gradients = tape.gradient(current_loss, model.trainable_variables)
# The tape is now consumed
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
Что еще более важно, я не вижу цикла в обучающем наборе, поэтому я полагаю, что полный код выглядит следующим образом:
for epoch in range(n_epochs):
for df, classification in dataset:
# your code that computes loss and trains
Более того, использование метрик неверно.
Вы хотите накапливать, таким образом, обновлять внутреннее состояние операции точности на каждом этапе обучения и измерять общую точность в конце каждой эпохи.
Таким образом, вы должны:
# Measure the accuracy inside the training loop
accuracy.update_state(model(df), classification)
И вызывать accuracy.result()
только в конце эпохи, когда все значения точности будут сохранены в метрике.
Не забудьте вызвать метод .reset_states()
, чтобы очистить состояния переменных, обнуляя его в конце каждой эпохи.