Использование metric.Mean () в тензорном потоке - PullRequest
0 голосов
/ 28 декабря 2018

Я работаю над учебником по тензорному потоку в 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.

Итак, мой вопрос, есть ли другой способ написать это, чтобы получить тот же результат, и мое объяснение того, что происходит правильно, а если нет, то что происходит?

Спасибо

1 Ответ

0 голосов
/ 28 декабря 2018

Для работы с Eager Execution необходимо изменить tf.metrics.Mean и tf.metrics.Accuracy на:

epoch_loss_avg = tf.contrib.eager.metrics.Mean()
epoch_accuracy = tf.contrib.eager.metrics.Accuracy()

, а также tf.Variable на:

global_step = tf.contrib.eager.Variable(0)

Из того, что я понимаю, они пытаются сделать в коде: назначьте функцию для tf.metrics.Mean () для epoch_loss_avg, а затем примените ее далее в epoch_loss_avg (loss_value).

Дав строке epoch_loss_avg = tf.metrics.Mean() они создают операцию для вычисления среднего, а затем накапливают потери по партиям в строке epoch_loss_avg(loss_value).Таким образом, в конце эпохи мы получим среднюю потерю, учитывая все партии из набора данных, что приведет к потере для эпохи (строка epoch_loss_avg.result()).

О второй ошибке: tf.metrics.mean повышает RuntimeError, если активное выполнение включено, как вы видели.Вам нужно использовать tf.contrib.eager.metrics.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...