Keras 中的 model.fit() 和 model.evaluate() 有什么区别?
What is the difference between model.fit() an model.evaluate() in Keras?
我正在使用带有 TensorFlow 后端的 Keras 来训练 CNN 模型。
model.fit()
和 model.evaluate()
之间是什么?我应该理想地使用哪一个? (我现在正在使用 model.fit()
)。
我知道 model.fit()
和 model.predict()
的用处。但是我无法理解 model.evaluate()
的效用。 Keras 文档只是说:
It is used to evaluate the model.
我觉得这是一个非常模糊的定义。
fit()
用于使用给定输入(和相应的训练标签)训练模型。
evaluate()
用于使用验证(或测试)数据和相应标签评估已训练的模型。 Returns 模型的损失值和指标值。
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))
现在让我们在 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]
fit():训练模型给定数量的epochs(这是为了训练时间,使用训练数据集)。
predict():为输入样本生成输出预测(这是在训练和测试时间之间的某个时间)。
evaluate(): Returns 测试模式下模型的损失值和指标值(这是用于测试时间,使用测试数据集)。
在深度学习中,您首先要训练您的模型。您将数据分成两组:训练集和测试集。 80% 的数据进入训练集,20% 的数据进入测试集,这似乎很常见。
您的训练集被传递到您对 fit()
的调用中,您的测试集被传递到您对 evaluate()
的调用中。在拟合操作期间,您的训练数据的许多行被输入您的神经网络(基于您的批量大小)。发送每批次后,拟合算法会进行反向传播以调整神经网络中的权重。
完成后,你的神经网络就训练好了。问题是有时你的神经网络会过度拟合,这是一种对训练集表现良好但对其他数据表现不佳的情况。为了防止这种情况,你 运行 evaluate()
函数通过你的神经网络发送新数据(你的测试集),看看它如何处理它从未见过的数据。没有培训发生,这纯粹是一个测试。如果一切顺利,那么训练的分数与测试的分数相似。
虽然以上所有答案都解释了这些函数的作用:fit()、evaluate() 或 predict(),但我认为更重要的一点是要记住 fit() 和 evaluate 应该使用哪些数据().
我在 Machine Learning Mastery 中遇到的最明确的指导方针和其中的特别引述:
训练集:用于学习的一组样例,即拟合分类器的参数。
验证集:一组用于调整分类器参数的示例,例如选择神经网络中隐藏单元的数量。
测试集:一组示例,仅用于评估完全指定分类器的性能。
:Brian Ripley,第 354 页,模式识别和神经网络,1996
您不应使用用于训练(调整)模型(验证数据)的相同数据来评估完全训练模型(评估)的性能(泛化)。
用于 evaluate() 的测试数据应该 unseen/not 用于训练 (fit()),以便成为模型评估(用于泛化)的任何可靠指标。
对于 Predict(),您可以仅使用您选择的一个或几个示例(来自任何地方)以从您的模型中快速检查或回答。我不相信它可以用作泛化的唯一参数。
这里没有提到的一件事,我认为需要具体说明。 model.evaluate() returns 包含损失数字和准确度数字的列表。上面的答案中没有说的是,“损失”数字是为 x_test 数组中的每个项目计算的所有损失的总和。 x_test 将包含您的测试数据,而 y_test 将包含您的标签。应该清楚的是,损失数字是 ALL 损失的总和,而不仅仅是 x_test 数组中一项的损失。
我会说所有迭代产生的损失的平均值,而不是总和。但是当然,这是这里最重要的信息,否则建模者会有点困惑。
我正在使用带有 TensorFlow 后端的 Keras 来训练 CNN 模型。
model.fit()
和 model.evaluate()
之间是什么?我应该理想地使用哪一个? (我现在正在使用 model.fit()
)。
我知道 model.fit()
和 model.predict()
的用处。但是我无法理解 model.evaluate()
的效用。 Keras 文档只是说:
It is used to evaluate the model.
我觉得这是一个非常模糊的定义。
fit()
用于使用给定输入(和相应的训练标签)训练模型。
evaluate()
用于使用验证(或测试)数据和相应标签评估已训练的模型。 Returns 模型的损失值和指标值。
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))
现在让我们在 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]
fit():训练模型给定数量的epochs(这是为了训练时间,使用训练数据集)。
predict():为输入样本生成输出预测(这是在训练和测试时间之间的某个时间)。
evaluate(): Returns 测试模式下模型的损失值和指标值(这是用于测试时间,使用测试数据集)。
在深度学习中,您首先要训练您的模型。您将数据分成两组:训练集和测试集。 80% 的数据进入训练集,20% 的数据进入测试集,这似乎很常见。
您的训练集被传递到您对 fit()
的调用中,您的测试集被传递到您对 evaluate()
的调用中。在拟合操作期间,您的训练数据的许多行被输入您的神经网络(基于您的批量大小)。发送每批次后,拟合算法会进行反向传播以调整神经网络中的权重。
完成后,你的神经网络就训练好了。问题是有时你的神经网络会过度拟合,这是一种对训练集表现良好但对其他数据表现不佳的情况。为了防止这种情况,你 运行 evaluate()
函数通过你的神经网络发送新数据(你的测试集),看看它如何处理它从未见过的数据。没有培训发生,这纯粹是一个测试。如果一切顺利,那么训练的分数与测试的分数相似。
虽然以上所有答案都解释了这些函数的作用:fit()、evaluate() 或 predict(),但我认为更重要的一点是要记住 fit() 和 evaluate 应该使用哪些数据().
我在 Machine Learning Mastery 中遇到的最明确的指导方针和其中的特别引述:
训练集:用于学习的一组样例,即拟合分类器的参数。
验证集:一组用于调整分类器参数的示例,例如选择神经网络中隐藏单元的数量。
测试集:一组示例,仅用于评估完全指定分类器的性能。
:Brian Ripley,第 354 页,模式识别和神经网络,1996
您不应使用用于训练(调整)模型(验证数据)的相同数据来评估完全训练模型(评估)的性能(泛化)。
用于 evaluate() 的测试数据应该 unseen/not 用于训练 (fit()),以便成为模型评估(用于泛化)的任何可靠指标。
对于 Predict(),您可以仅使用您选择的一个或几个示例(来自任何地方)以从您的模型中快速检查或回答。我不相信它可以用作泛化的唯一参数。
这里没有提到的一件事,我认为需要具体说明。 model.evaluate() returns 包含损失数字和准确度数字的列表。上面的答案中没有说的是,“损失”数字是为 x_test 数组中的每个项目计算的所有损失的总和。 x_test 将包含您的测试数据,而 y_test 将包含您的标签。应该清楚的是,损失数字是 ALL 损失的总和,而不仅仅是 x_test 数组中一项的损失。
我会说所有迭代产生的损失的平均值,而不是总和。但是当然,这是这里最重要的信息,否则建模者会有点困惑。