为什么Keras model.fit和model.evaluate的精度不同?

为什么Keras model.fit和model.evaluate的精度不同?,keras,Keras,我试图拟合Keras模型,并使用历史对象和评估 函数以查看模型的性能。要计算so的代码如下所示: optimizer = Adam (lr=learning_rate) model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy') for epoch in range (start_epochs, start_epochs

我试图拟合Keras模型,并使用历史对象和评估 函数以查看模型的性能。要计算so的代码如下所示:

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]

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


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

Ah,这就解释了这种现象+谢谢你的解释。供参考。你能指出哪里可以查看文档@DimitriW?@DanielVilas Boas该部分的链接断开了。请看答案,它解释了在培训与测试期间如何确定指标。