Keras中的model.fit()和model.evaluate()有什么区别?

44

我使用带有TensorFlow后端的Keras来训练CNN模型。

model.fit()model.evaluate()之间有什么区别?哪一个是理想的选择?(目前我正在使用model.fit())。

我知道model.fit()model.predict()的用途,但是我无法理解model.evaluate()的用处。Keras文档只是说:

它用于评估模型。

我觉得这是一个非常模糊的定义。


自最初提问以来,发生了很多事情,包括文档的显着改进;因此,我在这里提供一个链接,指向Tensorflow 2.x Python API的Keras API“Model”:compile(配置模型进行训练); fit(为固定数量的epochs训练模型); evaluate(返回测试模式下模型的损失值和指标值); predict(为输入样本生成输出预测)。https://www.tensorflow.org/api_docs/python/tf/keras/Model - michael
7个回答

66

fit() 用于使用给定的输入(和相应的训练标签)训练模型。

evaluate() 用于使用验证(或测试)数据和相应的标签评估已经训练好的模型。返回模型的损失值和指标值。

predict() 用于实际预测。它为输入样本生成输出预测。

让我们考虑一个简单的回归例子:

# input and output
x = np.random.uniform(0.0, 1.0, (200))
y = 0.3 + 0.6*x + np.random.normal(0.0, 0.05, len(y))

enter image description here

现在让我们在Keras中应用回归模型:

# A simple regression model
model = Sequential()
model.add(Dense(1, input_shape=(1,)))
model.compile(loss='mse', optimizer='rmsprop')

# The fit() method - trains the model
model.fit(x, y, nb_epoch=1000, batch_size=100)

Epoch 1000/1000
200/200 [==============================] - 0s - loss: 0.0023

# The evaluate() method - gets the loss statistics
model.evaluate(x, y, batch_size=200)     
# returns: loss: 0.0022612824104726315

# The predict() method - predict the outputs for the given inputs
model.predict(np.expand_dims(x[:3],1)) 
# returns: [ 0.65680361],[ 0.70067143],[ 0.70482892]

即使 model.fit() 返回损失和准确率,我对 model.fit() 和 model.evaluate() 有点模糊。 - Abhijit Balaji
fit() 用于训练模型。它会生成训练集的度量指标,而 evaluate() 则用于在测试集上测试已训练好的模型。 - Vijay Mariappan
如果我们没有传递任何 xy 参数,evaluate() 返回什么?据我所知,它们的默认值是 None,这意味着它们不是必需的。 - Chhaganlaal
fit()方法还允许在训练数据集中传递验证数据集。因此,如果您在fit()方法中同时传递这两个数据集进行模型训练,那么当您在训练完成后在验证数据集上运行evaluate()方法时,预计准确率和损失值将相同。我只是很好奇。 - ptn77
@vijayachandran-mariappan 我已经从keras编译块中获得了recallaccuracyaucprecision。这真的很方便。我们如何单独访问每个指标,以便我们可以使用它们?似乎它们不能通过点语法或下标访问。 - Edison

12
在深度学习中,首先要训练模型。您需要将数据分成两组:训练集和测试集。通常情况下,80%的数据用于训练集,20%的数据用于测试集。
您的训练集会在fit()函数中使用,测试集会在evaluate()函数中使用。在训练期间,您的神经网络将根据您的批量大小逐行读取训练数据。每次传送一个批次数据后,fit算法都会进行反向传播以调整神经网络中的权重。
完成这些步骤后,您的神经网络就已经训练好了。但有时候,神经网络会发生过拟合现象,即它在处理训练集时表现得很好,但在处理其他数据时却表现糟糕。为避免这种情况发生,您需要运行evaluate()函数,将新数据(即测试集)发送到您的神经网络中,以查看它在处理未见过的数据时表现如何。这不会进行任何训练,纯粹是一项测试。如果一切顺利,那么训练得分与测试得分应该相似。

想象一下,我已经对数据集#1进行了拟合+评估+预测,现在我想在数据集#2上进行预测,而不进行任何拟合,这是否可能?我还需要再次进行评估吗? - bardulia
1
训练有两种方式 - 监督式和无监督式。监督式数据是指你已经知道答案,所以你用已知答案的数据进行拟合和评估,然后预测那些你没有答案的数据。如果你已经知道数据集#2的答案,那么你就不需要对它进行预测。你可以将其添加到数据集#1中,重新进行拟合和评估,以提供更好的预测结果。如果你不知道答案,那么你可以将数据集#2通过预测函数进行预测,然后根据预测结果进行操作。 - undefined

4

fit(): 用给定的epoch数训练模型(这是针对训练时间,使用训练数据集)。

predict(): 为输入样本生成输出预测结果(这是在训练和测试之间进行的)。

evaluate(): 在测试模式下返回模型的损失值和指标值(这是使用测试数据集进行测试时间的)。


2

这里没有提到的一件事,我认为需要指明。model.evaluate()返回一个列表,其中包含损失和准确率。在上面的答案中没有提到的是,“损失”数字是计算x_test数组中每个项目的所有损失的总和。x_test应该包含你的测试数据,y_test应该包含你的标签。很明显,损失数字是所有损失的总和,而不仅仅是x_test数组中一个项目的一个损失。


非常有帮助! - user3234810
1
损失值是测试数据集上的平均损失(所有损失之和除以测试数据集中的项目数)。 - Youjun Hu

2
虽然以上所述的函数: fit(),evaluate()或predict()都解释了它们的作用,但在我看来更重要的是要知道应该为fit()和evaluate()使用哪些数据。
我在“机器学习大师”中找到了一个最清晰的指南,并引用其中的一句话:
- 训练集: 用于学习的示例集,即调整分类器参数的集合。 - 验证集: 用于调整分类器参数的实例集,例如选择神经网络中的隐藏单元数。 - 测试集: 仅用于评估完全指定分类器的性能的实例集。
(by Brian Ripley,页面354,模式识别和神经网络,1996年)
您不应该使用用于训练(调整)模型的相同数据(验证数据)来评估您完全训练的模型(评估)的性能(泛化)。
evaluate()使用的测试数据不应该被用于fit()中已经使用过的数据以获得可靠的模型评估指标(泛化)。
对于predict(),您可以使用您选择的一个或少量示例(从任何地方)快速检查或获取模型答案。 我不认为它可以作为泛化的唯一参数。

有使用 evaluate() 的理由吗?因为在 fit() 中已经可以传递验证数据集。而在 predict() 中,我们会使用测试数据集。 - Murilo

0
我会说所有迭代产生的损失的平均值,而不是总和。但当然,这是最重要的信息,在没有这个信息的情况下,建模者会稍微感到困惑。

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

0
根据文档,model.evaluate()返回测试损失(越低越好)和“指标”。
这里的指标是指在模型编译时包含的所有指标。
要获取特定模型的这些信息,可以使用print(model.metric_names)
(但并不是每个模型都一定包含这些指标。) 这是一个可以在编译模型时包含的指标列表
Fit是在编译后用于训练模型的函数。
Evaluate仅在训练完成后使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接