Я работаю над учебником по тензорному потоку в Google Colabs и запустил все, как указано в учебнике по ссылке ниже:
https://www.tensorflow.org/tutorials/eager/custom_training_walkthrough
, и я запускаю следующий фрагмент кода:
## Note: Rerunning this cell uses the same model variables
# keep results for plotting
train_loss_results = []
train_accuracy_results = []
num_epochs = 201
for epoch in range(num_epochs):
epoch_loss_avg = tf.metrics.Mean()
epoch_accuracy = tf.metrics.Accuracy()
# Training loop - using batches of 32
for x, y in train_dataset:
# Optimize the model
loss_value, grads = grad(model, x, y)
optimizer.apply_gradients(zip(grads, model.variables),
global_step)
# Track progress
epoch_loss_avg(loss_value) # add current batch loss
# compare predicted label to actual label
epoch_accuracy(tf.argmax(model(x), axis=1, output_type=tf.int32), y)
# end epoch
train_loss_results.append(epoch_loss_avg.result())
train_accuracy_results.append(epoch_accuracy.result())
if epoch % 50 == 0:
print("Epoch {:03d}: Loss: {:.3f}, Accuracy: {:.3%}".format(epoch,
epoch_loss_avg.result(),
epoch_accuracy.result()))
Но когда я запускаю его, я получаю следующую ошибку:
AttributeError: module 'tensorflow._api.v1.metrics' has no attribute 'Mean'
Из того, что я понимаю, они пытаются сделать в коде, это назначить функцию для tf.metrics.Mean () для epoch_loss_avg, а затем применить его ниже в epoch_loss_avg (loss_value).Поэтому я думаю, что, возможно, что-то изменилось в Tensorflow с момента написания этого учебника, поэтому я попытался переписать его, как показано ниже:
## Note: Rerunning this cell uses the same model variables
# Keep results for plotting
train_loss_results = []
train_accuracy_result = []
num_epochs = 201
for epoch in range(num_epochs):
#epoch_loss_avg = tf.metrics.Mean()
#epoch_accuracy = tf.metrics.Accuracy()
# Training loop - using batches of 32
for x, y in train_dataset:
# Optimize the model
loss_value, grads = grad(model, x, y)
optimizer.apply_gradients(zip(grads, model.variables),
global_step)
# Track progress
mean_temp = tf.metrics.mean(loss_value) # Add current batch loss
# Compare the predicted label to actual label
acc_temp = tf.metrics.accuracy(tf.argmax(model(x), axis = 1, output_type = tf.int32), y)
# End epoch
train_loss_results.append(mean_temp)
train_accuracy_results.append(acc_temp)
if epoch % 50 == 0:
print("Epoch {:03d}: Loss: {:,3f}, Accuracy: {:.3f}".format(epoch,
epoch_loss_avg.result(),
epoch_accuracy.result()))
Где функция просто запускается напрямую, но теперь я получаю другое сообщение об ошибке:
RuntimeError: tf.metrics.mean is not supported when eager execution is enabled.
Итак, мой вопрос, есть ли другой способ написать это, чтобы получить тот же результат, и мое объяснение того, что происходит правильно, а если нет, то что происходит?
Спасибо