尝试在 Keras 中加载顺序模型时出现“KeyError:0”

Posted

技术标签:

【中文标题】尝试在 Keras 中加载顺序模型时出现“KeyError:0”【英文标题】:"KeyError: 0" when trying to load a sequential model in Keras 【发布时间】:2019-03-25 07:47:02 【问题描述】:

我使用 Google Colab 在 Keras 中训练了一个顺序模型,以处理 Google Doodle 数据集。我在这里做一些简单的图像分类。

以下函数定义了我的模型的架构:

def create_model(input_shape):
   model = keras.Sequential()  
   model.add(layers.Conv2D(16, (3, 3), padding = 'same', input_shape = input_shape, activation = 'relu'))
   model.add(layers.BatchNormalization(axis = 3)) 
   model.add(layers.MaxPooling2D(pool_size = (2, 2)))

   model.add(layers.Conv2D(32, (3, 3), padding = 'same', activation = 'relu'))
   model.add(layers.BatchNormalization(axis = 3))
   model.add(layers.MaxPooling2D(pool_size = (2, 2)))

   model.add(layers.Conv2D(64, (3, 3), padding = 'same', activation = 'relu'))
   model.add(layers.BatchNormalization(axis = 3))
   model.add(layers.MaxPooling2D(pool_size = (2,2)))

   model.add(layers.Flatten())
   model.add(layers.Dense(128, activation = 'relu'))
   model.add(layers.Dense(28, activation = 'softmax')) 

   return model

下面的代码会创建、编译和适配它:

doodle_model = create_model((image_size, image_size, 1)) #image_size = 28
doodle_model.compile (optimizer = "Adam", loss = "categorical_crossentropy", metrics = ["accuracy"])
doodle_model.fit (x = X_train, y = Y_train, epochs = 4, batch_size = 256)

我使用这个模型得到了很好的结果,所以我决定保存它以便稍后在网络应用程序中部署它。我用过:

doodle_model.save("my_model.h5")

保存模型

但是,当我尝试再次加载模型时:

from keras.models import load_model
model = load_model ("my_model.h5")

为了确保它是否正确保存,我收到以下错误...

KeyError                                  Traceback (most recent call last)
<ipython-input-61-6cde554a8add> in <module>()
      1 from keras.models import load_model
      2 
----> 3 model = load_model ("my_model.h5")

/usr/local/lib/python3.6/dist-packages/keras/models.py in load_model(filepath, custom_objects, compile)
    268             raise ValueError('No model found in config file.')
    269         model_config = json.loads(model_config.decode('utf-8'))
--> 270         model = model_from_config(model_config, custom_objects=custom_objects)
    271 
    272         # set weights

/usr/local/lib/python3.6/dist-packages/keras/models.py in model_from_config(config, custom_objects)
    345                         'Maybe you meant to use '
    346                         '`Sequential.from_config(config)`?')
--> 347     return layer_module.deserialize(config, custom_objects=custom_objects)
    348 
    349 

/usr/local/lib/python3.6/dist-packages/keras/layers/__init__.py in deserialize(config, custom_objects)
     53                                     module_objects=globs,
     54                                     custom_objects=custom_objects,
---> 55                                     printable_module_name='layer')

/usr/local/lib/python3.6/dist-packages/keras/utils/generic_utils.py in deserialize_keras_object(identifier, module_objects, custom_objects, printable_module_name)
    142                 return cls.from_config(config['config'],
    143                                        custom_objects=dict(list(_GLOBAL_CUSTOM_OBJECTS.items()) +
--> 144                                                            list(custom_objects.items())))
    145             with CustomObjectScope(custom_objects):
    146                 return cls.from_config(config['config'])

/usr/local/lib/python3.6/dist-packages/keras/models.py in from_config(cls, config, custom_objects)
   1404     @classmethod
   1405     def from_config(cls, config, custom_objects=None):
-> 1406         if 'class_name' not in config[0] or config[0]['class_name'] == 'Merge':
   1407             return cls.legacy_from_config(config)
   1408 

KeyError: 0

据我所知,KeyErrors 与 python 字典有关,但我不确定为什么会在这里遇到 KeyError。任何有关我为什么会收到此错误以及如何解决此错误的帮助将不胜感激。

每一段代码,行后

----> 3 model = load_model ("my_model.h5")

这个错误信息是Keras的一些内部代码,不是我写的。

【问题讨论】:

我遇到了同样的错误。我用 h5py 打开了模型文件并检查了它的键。只有两个键,即。 ['model_weights','optimizer_weights']。这可能意味着架构根本没有保存!您可以从 h5 文件中发布您的密钥吗? 【参考方案1】:

您使用的是什么 Keras 版本? 如果是 2.1.6,请尝试 Keras 2.2.4 或更高版本,您的问题就会消失。它发生在我身上。

【讨论】:

【参考方案2】:

这是因为keras版本不匹配。在继续之前检查版本。构建具有所有兼容版本的虚拟环境。尝试使用 keras 2.2.4

【讨论】:

【参考方案3】:

听起来您可能正在尝试使用与您用于保存模型的版本不兼容的 Keras 版本来加载保存的模型。

您在每种情况下都使用哪些版本?您可以使用以下方式检查:

import keras
print(keras.__version__)

您的解决方法可能是升级您的 Keras 版本。

【讨论】:

出于某种原因,做... >> model = keras.models.load_model ("my_model.h5") 而不是... >> from keras.models import load_model >> model = load_model ("my_model.h5") 对我有用。不太确定真正的问题是什么,但如果我发现了,我会解决并在此处发布。 @SudeepamPandey 我认为这不会带来改变。一定还有一些你可能没有注意到的东西。 版本不匹配导致我出现 TF2x 的这个问题。具体来说,使用 TF 2.2.0 保存模型,并使用 TF 2.1.0 加载它。通过在我的本地机器上升级到 2.2.0,问题就解决了。

以上是关于尝试在 Keras 中加载顺序模型时出现“KeyError:0”的主要内容,如果未能解决你的问题,请参考以下文章

加载图像时出现numpy memory错误

在 Tensorflow 中加载文本分类模型时出现 ValueError

在 keras 中加载模型时图形断开错误

在 django 开发中加载静态文件时出现 404 错误

“尝试在浏览器窗口中加载我的flask应用程序时出现URL未找到错误”

尝试在 WKWebview 中加载 url 但在 SFSafariViewController 或 iOS 中的外部 safari 中工作正常时出现会话过期错误