为什么Keras model.fit和model.evaluate之间的准确度不同?

时间:2017-12-31 10:54:36

标签: keras

我正在尝试使用Keras模型并同时使用历史对象并进行评估 用于查看模型的执行情况。计算的代码如下:

optimizer = Adam (lr=learning_rate)
model.compile(loss='categorical_crossentropy', 
              optimizer=optimizer, 
              metrics=['accuracy')
for epoch in range (start_epochs, start_epochs + epochs):
    history = model.fit(X_train, y_train, verbose=0, epochs=1, 
                batch_size=batch_size,
                validation_data=(X_val, y_val))

    print (history.history)
    score = model.evaluate(X_train, y_train, verbose=0)
    print ('Training accuracy', model.metrics_names, score)
    score = model.evaluate(X_val, y_val, verbose=0)
    print ('Validation accuracy', model.metrics_names, score)

令我惊讶的是,训练集的准确性和损失结果在历史和评估之间有所不同。由于验证集的结果是相同的,所以我的身边似乎有些失误,但我找不到任何东西。我给出了下面前四个时期的输出。我得到了相同的度量标准' mse':训练集不同,测试集相等。有人有什么想法吗?

{'val_loss': [13.354823187591416], 'loss': [2.7036468725265874], 'val_acc': [0.11738484422572477], 'acc': [0.21768202061048531]}
Training accuracy ['loss', 'acc'] [13.265716915499048, 0.1270430906536911]
Validation accuracy ['loss', 'acc'] [13.354821096026349, 0.11738484398216939]

{'val_loss': [11.733116257598105], 'loss': [1.8158155931229045], 'val_acc': [0.26745913783295899], 'acc': [0.34522040671733062]}
Training accuracy ['loss', 'acc'] [11.772184015560292, 0.26721149086656992]
Validation accuracy ['loss', 'acc'] [11.733116155570542, 0.26745913818722139]

{'val_loss': [7.1503656643815061], 'loss': [1.5667824202566349], 'val_acc': [0.26597325444044367], 'acc': [0.44378405117114739]}
Training accuracy ['loss', 'acc'] [7.0615554528994506, 0.26250619121327617]
Validation accuracy ['loss', 'acc'] [7.1503659895943672, 0.26597325408618128]

{'val_loss': [4.2865109046890693], 'loss': [1.4087548087645783], 'val_acc': [0.13893016366866509], 'acc': [0.49232293093422957]}
Training accuracy ['loss', 'acc'] [4.1341019072350802, 0.14338781575775195]
Validation accuracy ['loss', 'acc'] [4.2865103747125541, 0.13893016344725112]

1 个答案:

答案 0 :(得分:9)

没有什么可惊讶的,训练集上的指标只是训练期间所有批次的平均值,因为每个批次的权重都在变化。

使用model.evaluate将保持模型权重不变并计算您提供的整个数据的损失/准确性。如果您想要在训练集上获得损失/准确性,那么您必须使用{{1并将训练集传递给它。历史对象在训练集上没有真正的损失/准确性。