需要在`Model.evaluate()之前编译Keras模型`

需要在`Model.evaluate()之前编译Keras模型`,keras,Keras,我从.json和.hdf5文件加载Keras模型。调用model.evaluate()时,它返回一个错误: 您必须在培训/测试之前编译模型。使用`model.compile(优化器,loss) 为什么我需要编译来运行evaluate() 要添加,可以毫无问题地传递模型predict() 因为将计算损失函数和度量 在编译模型之前,您没有任何一个模型。它们是编译方法的参数: model.compile(optimizer=..., loss=..., metrics=...) 另一方面,它不评估

我从.json.hdf5文件加载
Keras
模型。调用
model.evaluate()
时,它返回一个错误:

您必须在培训/测试之前编译模型。使用`model.compile(优化器,loss)

为什么我需要编译来运行
evaluate()

要添加,可以毫无问题地传递模型
predict()

因为将计算损失函数和度量

在编译模型之前,您没有任何一个模型。它们是编译方法的参数:

model.compile(optimizer=..., loss=..., metrics=...) 
另一方面,它不评估任何度量或损失,只通过模型传递输入数据并获得其输出

你也需要“损失”来训练,所以你不能不编译就训练。您可以根据需要多次编译模型,甚至更改参数


输出和损耗函数:

模型的输出取决于使用权重定义的模型。这是自动的,您可以从任何模型
预测
,即使不需要任何培训。Keras中的每个模型都已经与生俱来了权重(由您初始化或随机初始化)

当你输入一些东西时,模型会计算输出。归根结底,这才是最重要的。一个好的模型有适当的权重,并且输出正确

但在达到这一目的之前,你的模型需要经过训练

现在,损耗函数获取当前输出,并将其与预期/真实结果进行比较。这是一个应该最小化的函数。损失越少,结果就越接近预期。这是从中获取导数的函数,因此反向传播算法可以更新权重


损失函数对于模型的最终目的并不有用,但对于训练是必要的。这可能就是为什么您可以使用没有损失函数的模型(因此,无法对其进行评估)

我知道你在问为什么,我相信上面的答案就足够了。然而,如果你得到了这个错误,我就是这么做的,这仅仅是因为我有一个编码错误。我复制了模型_1,并将其粘贴以创建模型_2。但是,我忘了将部分代码从模型1更改为模型2。这对我来说是一个愚蠢的举动,但我得到了与上述相同的错误。见下图:

这就是解决办法:

为了补充@Daniel Möller的伟大答案,重新编译模型还重新启用了(自定义)
指标
,您可以使用一个简单的
模型监控验证损失,或者现在就要计算测试数据。评估
调用。这确保您在测试数据上使用完全相同的度量


如果您通过
y\u测试
,这甚至可以计算测试样本的
损失
,这通常会在研究论文中报告。

您是否使用
加载权重()加载模型。
?HDF5格式用于严格保存权重。你能提供代码吗?谢谢。你用的是什么Keras版本?你介意解释一下为什么在中,不需要编译来调用model.evaluate吗?load_模型(fcn_vgg16_weights.h5)是否以某种方式包含损失函数?不幸的是,我从未能够在Keras中保存和加载模型,我不知道会发生什么。对我来说,这完全是马车,我只能节省重量。但从理论上讲,是的,可以用损失函数和优化器状态保存模型。但这并不意味着每个保存的模型都会这样保存。@B是的,
load\u model()
函数实际上有一个
model.compile()
调用。只要模型在保存前已编译,加载后将自动重新编译。每次更改哪些层是可训练的或不可训练的,您似乎都需要重新编译。是的,您需要这样做。