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

时间:2017-09-09 05:59:16

标签: keras

我从 .json .hdf5 文件加载Keras模型。当我拨打model.evaluate()时,会返回错误:

  

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

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

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

3 个答案:

答案 0 :(得分:12)

因为evaluate会计算损失函数和指标

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

model.compile(optimizer=..., loss=..., metrics=...) 

另一方面,predict不会评估任何指标或损失,它只是通过模型传递输入数据并获取其输出。

你也需要“损失”进行训练,所以你不能在没有编译的情况下进行训练。您可以根据需要多次编译模型,甚至可以更改参数。

输出和损失功能:

模型的输出取决于它是用权重定义的。这是自动的,你可以predict从任何模型,即使没有任何培训。 Keras的每个模型都已经生成了权重(由您初始化或随机初始化)

您输入内容,模型计算输出。最重要的是,这一切都很重要。一个好的模型有适当的权重,并正确输出的东西。

但在达到目的之前,您的模型需要接受培训。

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

损失函数对于模型的最终目的没有用,但它对培训是必要的。这可能就是为什么你可以拥有没有损失函数的模型(因此,没有办法评估它们)。

答案 1 :(得分:0)

我知道您在问原因,我相信上面的答案就足够了。但是,如果您得到了我所做的此错误,那仅仅是因为我遇到了编码错误。我复制了model_1,然后将其粘贴以创建model_2。但是,我忘记将部分代码从model_1更改为model_2。这对我来说是个笨蛋,但我得到了与上述相同的确切错误。见下图:

enter image description here

这是解决方法: enter image description here

答案 2 :(得分:0)

要添加到@DanielMöller的一个很好的答案中,重新编译模型还会重新启用(自定义)metrics,您曾经用来监视验证损失,或​​者现在想使用简单的{{1} }。这样可以确保您对测试数据使用完全相同的指标。

如果您通过model.evaluate,甚至可以计算出测试样品上的y_test,这通常会在研究论文中得到报道。