【问题标题】:how to calculate the average of training accuracy in Keras?如何计算 Keras 中训练准确率的平均值?
【发布时间】:2018-09-27 03:49:15
【问题描述】:

我正在尝试计算用 KERAS 编写的 y 模型中训练准确度的平均值,我有 200 个 epoch。所以最后我想将每个时期的每个训练精度与前一个相加,然后除以 200..

这是我的代码

num = 200
total_sum = 0
for n in range(num):
    avg_train=np.array(model.fit(x_train,y_train, epochs=200, batch_size=64, verbose=2))
    total_sum = avg_train + total_sum
avg = total_sum/num

score=model.evaluate(x_test, y_test, verbose=2)
print(score)
print('the average is',avg)

我试图将每个精度存储在一个 numpy 数组中,以便能够在求和运算中使用它,但它给了我以下错误

Traceback (most recent call last):
  File "G:\Master Implementation\MLPADAM.py", line 87, in <module>
    total_sum = avg_train + total_sum
TypeError: unsupported operand type(s) for +: 'History' and 'int' 

【问题讨论】:

  • np.model.evaluate???另外,您的代码将适合 200 个 epoch 200 次 (num),我猜这不是您想要的……
  • np.model ,我已经编辑了它,并且 num=200 因为我在 for 循环中使用了它,迭代次数为 200
  • 按原样,它将运行 200 次迭代循环,每次迭代为 200 个 epoch(即总共 40,000 个 epoch)。这是你想要做的吗?
  • no.. 我只想计算 200 个 epoch 的训练精度
  • 我是这么认为的...查看答案(忘记循环!)

标签: python python-3.x machine-learning neural-network keras


【解决方案1】:

您的问题有几个问题...

首先,您的代码将适合具有 200 个 epoch 的模型 200 次,即总共 200*200 = 40,000 个 epoch。

此外,由于 Keras 中的 model.fit 是增量运行的,因此循环中每次调用 model.fit 都会从上一次迭代停止的地方继续训练,因此最终您确实会拥有一个适合 40,000 个 epoch 的模型。

假设这不是您想要做的,而您只是想要训练期间的平均准确率,答案是使用model.fit 返回的History 对象;来自model.fit docs

退货

History 对象。它的History.history 属性记录了连续 epoch 的训练损失值和指标值,以及验证损失值和验证指标值(如果适用)。

所以,这里有一个 MNIST 的快速演示,只有 5 个 epoch(忘记 for 循环!):

# your model definition
# your model.compile()

batch_size = 128
epochs = 5

hist = model.fit(x_train, y_train,
      batch_size=batch_size,
      epochs=epochs,
      verbose=1,
      validation_data=(x_test, y_test)  # optional
      )

# output
Train on 60000 samples, validate on 10000 samples
Epoch 1/5
60000/60000 [==============================] - 76s - loss: 0.3367 - acc: 0.8974 - val_loss: 0.0765 - val_acc: 0.9742
Epoch 2/5
60000/60000 [==============================] - 73s - loss: 0.1164 - acc: 0.9656 - val_loss: 0.0516 - val_acc: 0.9835
Epoch 3/5
60000/60000 [==============================] - 74s - loss: 0.0866 - acc: 0.9741 - val_loss: 0.0411 - val_acc: 0.9863
Epoch 4/5
60000/60000 [==============================] - 73s - loss: 0.0730 - acc: 0.9781 - val_loss: 0.0376 - val_acc: 0.9871
Epoch 5/5
60000/60000 [==============================] - 73s - loss: 0.0639 - acc: 0.9810 - val_loss: 0.0354 - val_acc: 0.9881

hist.history 是一个字典,其中包含每个时期的指标值:

hist.history
# result:
{'acc': [0.8973833333969117,
  0.9656000000635783,
  0.9740500000317891,
  0.9780500000635783,
  0.9810333334604899],
 'loss': [0.3367467244784037,
  0.11638248273332914,
  0.08664042545557023,
  0.07301943883101146,
  0.06391783343354861],
 'val_acc': [0.9742, 0.9835, 0.9863, 0.9871, 0.9881],
 'val_loss': [0.07650674062222243,
  0.051606363496184346,
  0.04107686730045825,
  0.03761903735231608,
  0.03537947320453823]}

要获得每个 epoch 的训练精度:

hist.history['acc']
# result:
[0.8973833333969117,
 0.9656000000635783,
 0.9740500000317891,
 0.9780500000635783,
 0.9810333334604899]

而平均值很简单

np.mean(hist.history['acc']) # numpy assumed imported as np
# 0.9592233334032695

【讨论】:

  • 在我的模型上像你一样在 5 个 epoch 上尝试你的代码时,它给了我以下警告:与批量更新相比,方法 on_batch_end() 很慢
  • @HadeerEl-Zayat 这只是一个警告(不是错误),与您的问题无关。这可能是由于小号。 epochs(见here),它也应该与你自己的代码一起出现,对于epochs=5。设置epochs=200 可能会清除它...
  • 我像你一样将 epochs 设置为 5,但我设置了 verbose = 2 它在没有警告的情况下运行
  • @HadeerEl-Zayat 那么,答案是否解决了您的问题??
  • @desertnaut,您的意思是 keras 将每个时期的准确率计算为所有批次的平均值吗?
猜你喜欢
  • 2018-07-20
  • 1970-01-01
  • 2020-02-11
  • 2020-10-17
  • 2018-09-18
  • 1970-01-01
  • 2018-12-20
  • 2018-05-10
  • 1970-01-01
相关资源
最近更新 更多