Python 如何计算Keras中的平均训练精度?
我试图计算y模型的平均训练精度,该模型是用KERAS编写的,我有200个纪元。最后,我想将每个历元的训练精度与前一历元相加,然后除以200 这是我的密码Python 如何计算Keras中的平均训练精度?,python,python-3.x,machine-learning,neural-network,keras,Python,Python 3.x,Machine Learning,Neural Network,Keras,我试图计算y模型的平均训练精度,该模型是用KERAS编写的,我有200个纪元。最后,我想将每个历元的训练精度与前一历元相加,然后除以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 a
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'
你的问题有几个问题 首先,您的代码将适合200个纪元200次的模型,即总共200*200=40000个纪元 此外,由于Keras中的model.fit是以增量方式运行的,因此循环中对model.fit的每次调用都将从上一次迭代停止的位置继续训练,因此,在最后,您将拥有一个包含40000个纪元的模型 假设这不是您想要做的,但您只希望在培训期间获得平均精度,答案是使用model.fit返回的历史对象;从: 返回 历史对象。其History.History属性是连续历次的培训损失值和度量值以及验证损失值和验证度量值(如果适用)的记录 因此,这里有一个MNIST的快速演示,只有5个时代,忘记了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]}
要获得每个历元的训练精度:
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
你的问题有几个问题 首先,您的代码将适合200个纪元200次的模型,即总共200*200=40000个纪元 此外,由于Keras中的model.fit是以增量方式运行的,因此循环中对model.fit的每次调用都将从上一次迭代停止的位置继续训练,因此,在最后,您将拥有一个包含40000个纪元的模型 假设这不是您想要做的,但您只希望在培训期间获得平均精度,答案是使用model.fit返回的历史对象;从: 返回 历史对象。其History.History属性是连续历次的培训损失值和度量值以及验证损失值和验证度量值(如果适用)的记录 因此,这里有一个MNIST的快速演示,只有5个时代,忘记了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]}
要获得每个历元的训练精度:
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
np.模型.评估???另外,您的代码将适合200个时代200倍于num,我猜这不是您想要的…np.model,我已经编辑了它,num=200,因为我在for循环中使用了200次迭代。是的,它将运行200次迭代循环,每次迭代为200个时代,即总共40000个时代。这就是你想做的吗?不。。我只想计算200个时代的训练准确度,我想是的。。。看答案,忘记循环!np.模型.评估???另外,您的代码将适合200个时代200倍于num,我猜这不是您想要的…np.model,我已经编辑了它,num=200,因为我在for循环中使用了200次迭代。是的,它将运行200次迭代循环,每次迭代为200个时代,即总共40000个时代。这就是你想做的吗?不。。我只想计算200个时代的训练准确度,我想是的。。。看答案,忘记循环!当你在我的模型上尝试你的代码时,它会给我以下警告:与批处理相比,批处理端的方法速度慢update@HadeerEl-扎亚特,这只是一个警告,不是错误,与你的问题无关。这可能是由于epochs的数量很少,请参见,它也应该与您自己的代码一起出现,因为epochs=5。将epochs设置为200可能会清除它…我将epochs设置为5,就像u一样,但我将verbose设置为2,它在没有warning@HadeerEl-扎亚特那么,答案解决了你的问题了吗???@desertnaut,你的意思是keras计算每个历元的准确度是否为所有批次的平均值?当在我的模型上对5个历元(如你)尝试代码时,它会给我以下警告:与批次相比,批次末端的方法速度较慢update@HadeerEl-扎亚特,这只是一个警告,不是错误,与你的问题无关。这可能是由于epochs的数量很少,请参见,它也应该与您自己的代码一起出现,因为epochs=5。将epochs设置为200可能会清除它…我将epochs设置为5,就像u一样,但我将verbose设置为2,它在没有warning@HadeerEl-扎亚特:那么,答案解决了你的问题吗?@desertnaut,你的意思是keras计算每个历元的准确度作为所有批次的平均值还是不?