【发布时间】:2017-09-09 05:59:16
【问题描述】:
我从 .json 和 .hdf5 文件加载了一个 Keras 模型。当我调用model.evaluate() 时,它返回一个错误:
您必须在训练/测试之前编译模型。使用 `model.compile(optimizer, loss)
为什么我需要编译运行evaluate()?
补充一下,模型可以通过predict()没有问题。
【问题讨论】:
标签: tensorflow keras
我从 .json 和 .hdf5 文件加载了一个 Keras 模型。当我调用model.evaluate() 时,它返回一个错误:
您必须在训练/测试之前编译模型。使用 `model.compile(optimizer, loss)
为什么我需要编译运行evaluate()?
补充一下,模型可以通过predict()没有问题。
【问题讨论】:
标签: tensorflow keras
因为evaluate 会计算损失函数和指标。
在编译模型之前,您没有任何一个。它们是编译方法的参数:
model.compile(optimizer=..., loss=..., metrics=...)
另一方面,predict 不评估任何指标或损失,它只是将输入数据通过模型并获取其输出。
你也需要训练的“损失”,所以你不能不编译就训练。您可以根据需要多次编译模型,甚至可以更改参数。
输出和损失函数:
模型的输出取决于使用权重定义。这是自动的,您可以从任何模型predict,即使没有任何培训。 Keras 中的每个模型都已经带有权重(由您初始化或随机初始化)
你输入一些东西,模型计算输出。归根结底,这才是最重要的。一个好的模型具有适当的权重并正确输出。
但在达到此目的之前,您的模型需要经过训练。
现在,损失函数获取当前输出并将其与预期/真实结果进行比较。这是一个应该最小化的功能。损失越少,您的结果就越接近预期。这是从中获取导数的函数,因此反向传播算法可以更新权重。
损失函数对于模型的最终目的没有用处,但它对于训练是必需的。这可能就是为什么您可以拥有没有损失函数的模型(因此,无法评估它们)。
【讨论】:
load_model() 函数内部实际上有一个 model.compile() 调用。只要模型在保存前编译过,加载时会自动重新编译。
要添加到@Daniel Möller 的出色答案,重新编译模型还可以通过简单的model.evaluate 调用重新启用您用于监控验证损失或现在想要计算测试数据的(自定义)metrics。这可确保您在测试数据上使用完全相同的指标。
如果您传递y_test,这甚至可以计算测试样本上的loss,这通常会在研究论文中报告。
【讨论】: