首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在tensorflow中使用metric.Mean()

在tensorflow中使用metric.Mean()
EN

Stack Overflow用户
提问于 2018-12-28 10:50:53
回答 1查看 1.3K关注 0票数 1

我正在阅读Google中的tensorflow教程,并按照本教程在下面链接中指定的内容运行所有内容:

walkthrough

我正在运行以下代码:

代码语言:javascript
复制
## 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()))

但是,当我运行它时,我会得到以下错误:

代码语言:javascript
复制
AttributeError: module 'tensorflow._api.v1.metrics' has no attribute 'Mean'

据我所知,他们试图在代码中将tf.metrics.Mean()的函数分配给epoch_loss_avg,然后在epoch_loss_avg(loss_value)中进一步应用它。因此,我在想,自从编写本教程以来,Tensorflow中可能发生了一些变化,因此我尝试将其改写如下:

代码语言:javascript
复制
## 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()))

函数直接运行的地方,但现在我收到了另一条错误消息:

代码语言:javascript
复制
RuntimeError: tf.metrics.mean is not supported when eager execution is enabled.

因此,我的问题是,是否有另一种方法来写出同样的结果,我对正在发生的事情的解释是正确的,如果不是,是怎么回事?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-28 12:40:06

为了执行急切的执行,您需要将tf.metrics.Meantf.metrics.Accuracy更改为:

代码语言:javascript
复制
epoch_loss_avg = tf.contrib.eager.metrics.Mean()
epoch_accuracy = tf.contrib.eager.metrics.Accuracy()

也可以通过tf.Variable

代码语言:javascript
复制
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代替。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53957338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档