【问题标题】:Unknown initializer: GlorotUniform when loading Keras model未知初始化器:加载 Keras 模型时的 GlorotUniform
【发布时间】:2019-04-10 13:15:19
【问题描述】:

我通过 google colab 训练了我的 CNN (VGG) 并生成了 .h5 文件。现在的问题是,我可以通过 google colab 成功预测我的输出,但是当我下载该 .h5 训练模型文件并尝试在我的笔记本电脑上预测输出时,我在加载模型时遇到错误。

代码如下:

import tensorflow as tf
from tensorflow import keras
import h5py

# Initialization

loaded_model = keras.models.load_model('./train_personCount_model.h5')

还有错误:

ValueError: Unknown initializer: GlorotUniform

【问题讨论】:

  • 可能是由于 google colab 和您本地机器的 Keras 版本不匹配造成的。
  • okie让我检查一下..!
  • 或者也有可能是tf.keras和keras混合造成的(不一样)。
  • @today 也许你是对的..我会承认这是否有效,反之亦然。
  • @MatiasValdenegro 我在两个平台上都使用过 tf.keras(即 google colab 和我的笔记本电脑)

标签: python tensorflow machine-learning keras google-colaboratory


【解决方案1】:

我遇到了同样的问题。更改后:

from tensorflow import keras

到:

import keras

生活再次值得过。

【讨论】:

  • 这行得通 :) 这是由于 keras 的版本不匹配。谢谢...!
  • 我不得不反其道而行之。
  • 我希望kerastensorflow 能够一劳永逸地找出它们的相互导入。我花在机器学习上的 80% 时间都花在根据我需要的功能来确定哪个导入是哪个。
【解决方案2】:

我解决了这个问题:

之前:

from keras.models import load_model
classifierLoad = load_model('model/modeltest.h5')

为我工作

import tensorflow as tf 
classifierLoad = tf.keras.models.load_model('model/modeltest.h5')

【讨论】:

    【解决方案3】:

    哇,我花了 6 个小时试图解决这个问题。Dmitri 在这里发布了一个解决方案:I trained a keras model on google colab. Now not able to load it locally on my system.

    我只是在这里重新发布它,因为它对我有用。

    这看起来像是 keras 中的某种序列化错误。 如果你用下面的 CustomObjectScope 包装你的 load_model ......一切都应该工作......

    import keras
    from keras.models import load_model
    from keras.utils import CustomObjectScope
    from keras.initializers import glorot_uniform
    
    with CustomObjectScope({'GlorotUniform': glorot_uniform()}):
            model = load_model('imdb_mlp_model.h5')
    

    【讨论】:

    • ^ 这是在 Flask 中使用模型时唯一对我有用的解决方案
    • 我碰巧使用了自定义初始化程序,您的解决方案有效!!!
    【解决方案4】:

    变化

    from keras.models import load_model
    

    from tensorflow.keras.models import load_model
    

    解决了我的问题!

    要消除错误,请直接从 Keras 或 TensorFlow 导入所有内容。在同一个项目中混合它们可能会导致问题。

    【讨论】:

    • 谢谢,这对我也有帮助。 TensorFlow 1.13.1
    • 这对我来说是固定的。我想问题是我发现 Keras 的 API 指南比 TF API 更容易理解。我猜 TF API 是为已经掌握 TF 的人编写的备忘单。
    【解决方案5】:

    我遇到了同样的问题,并以这种方式解决。只是不要用模型保存优化器! 只需像这样更改保存行:

    the_model.save(file_path,True/False,False)
    

    第二个参数告诉 Keras 在文件是否存在时覆盖模型,第三个参数告诉 Keras 不要将优化器与模型一起保存。


    编辑: 我今天在另一个系统上再次遇到了这个问题,这一次对我没有帮助。所以我将模型 conf 保存为 json 并将权重保存为 h5 并使用它们在另一台机器上重建模型。你可以这样做。 像这样保存:

    json = model.to_json()
    # Save the json on a file
    model.save_weights(weights_filepath,save_format="h5")
    

    像这样重建模型:

    # load the json file
    # here i use json as loaded content of json file
    model = keras.models.model_from_json(json)
    model.load_weights(weights_file_path)
    

    【讨论】:

    • 我在这里遇到了同样的问题,我认为这不是解决方案。错误发生在这行'model = keras.models.model_from_json(json)'
    【解决方案6】:

    Something 对我有帮助,但没有出现在任何答案中:

    custom_objects={'GlorotUniform': glorot_uniform()}

    【讨论】:

    • 澄清一下,这应该包含在 keras.models.load_model() 或 tf.keras.models.load_model() 的参数中
    【解决方案7】:

    在 kaggle 或 colabs 中

    tf.keras.models.load_model("model_path")
    

    效果很好

    【讨论】:

      【解决方案8】:
      from tensorflow.keras.initializers import glorot_uniform
      
      loaded_model = tf.keras.models.load_model("pruned.h5",custom_objects={'GlorotUniform': glorot_uniform()})
      
      

      这在导入 tensorflow keras 时对我有用

      【讨论】:

      • 我碰巧使用了自定义初始化程序,您的解决方案有效!!!
      【解决方案9】:

      如果您分别加载架构和权重,同时加载模型更改的架构:

      models.model_from_json(json)
      

      到:

      tf.keras.models.model_from_json(json)
      

      问题解决了

      【讨论】:

        【解决方案10】:

        我在使用 tensorflow 1.11.0(使用 tensorflow.python.keras.models.save_model)构建并使用 tensorflow 1.11.0(使用 tensorflow.python.keras.models.load_model)加载的模型时遇到了同样的问题。

        我通过将所有内容升级到 tensorflow 1.13.1 解决了这个问题,在使用新版本再次构建模型后,我可以加载它而不会出现此错误。

        【讨论】:

          【解决方案11】:

          对于@Derk在其中一条评论中提到的json文件问题,可以这样写:

          model_from_json(model_path, custom_objects = {'GlorotUniform': glorot_uniform()})
          

          在你的导入行中,记得写:

          from tensorflow.keras.initializers import glorot_uniform
          

          而不是from keras.initializers import glorot_uniform

          当我尝试在只有 tf1.9 的环境中读取保存在 tf2.2 中的模型时,它成功了。

          【讨论】:

            猜你喜欢
            • 2020-07-24
            • 2020-02-09
            • 2019-06-14
            • 2020-12-11
            • 2020-06-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多