【问题标题】:Need To Compile Keras Model Before `model.evaluate()`需要在`model.evaluate()`之前编译Keras模型
【发布时间】:2017-09-09 05:59:16
【问题描述】:

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

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

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

补充一下,模型可以通过predict()没有问题。

【问题讨论】:

    标签: tensorflow keras


    【解决方案1】:

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

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

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

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

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


    输出和损失函数:

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

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

    但在达到此目的之前,您的模型需要经过训练。

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

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

    【讨论】:

    • 您介意解释一下为什么在github.com/JihongJu/keras-fcn/blob/master/voc2011/infer.py 中,不需要编译来调用model.evaluate 吗? load_model(fcn_vgg16_weights.h5) 是否包含了损失函数?
    • 不幸的是,我从来没有能够在 Keras 中保存和加载模型,我不知道会发生什么。对我来说,这完全是越野车,我只能减轻重量。但从理论上讲,是的,可以保存具有损失函数和优化器状态的模型。但这并不意味着每个保存的模型都会这样保存。
    • @bhomass 是的,load_model() 函数内部实际上有一个 model.compile() 调用。只要模型在保存前编译过,加载时会自动重新编译。
    • 似乎每次更改哪些层可训练或不可训练时都需要重新编译。
    • 是的,你需要。
    【解决方案2】:

    我知道你在问为什么,我相信上面的答案就足够了。但是,如果您遇到了这个错误,那只是因为我遇到了编码错误。我复制了model_1,并将其粘贴以创建model_2。但是,我忘记将部分代码从 model_1 更改为 model_2。这对我来说是一个愚蠢的举动,但我得到了与上述相同的错误。见下图:

    这是修复:

    【讨论】:

      【解决方案3】:

      要添加到@Daniel Möller 的出色答案,重新编译模型还可以通过简单的model.evaluate 调用重新启用您用于监控验证损失或现在想要计算测试数据的(自定义)metrics。这可确保您在测试数据上使用完全相同的指标。

      如果您传递y_test,这甚至可以计算测试样本上的loss,这通常会在研究论文中报告。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-10
        • 2021-08-30
        • 1970-01-01
        • 1970-01-01
        • 2020-11-01
        • 1970-01-01
        相关资源
        最近更新 更多