【问题标题】:Read only mode in keraskeras 中的只读模式
【发布时间】:2019-04-12 06:03:55
【问题描述】:

我已经从这个链接human pose estimation keras克隆了人体姿态估计keras模型

当我尝试在 google colab 上加载模型时,出现以下错误

代码

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

错误

ValueError                                Traceback (most recent call 

last)
<ipython-input-29-bdcc7d8d338b> in <module>()
      1 from keras.models import load_model
----> 2 model = load_model('model.h5')

/usr/local/lib/python3.6/dist-packages/keras/engine/saving.py in load_model(filepath, custom_objects, compile)
    417     f = h5dict(filepath, 'r')
    418     try:
--> 419         model = _deserialize_model(f, custom_objects, compile)
    420     finally:
    421         if opened_new_file:

/usr/local/lib/python3.6/dist-packages/keras/engine/saving.py in _deserialize_model(f, custom_objects, compile)
    219         return obj
    220 
--> 221     model_config = f['model_config']
    222     if model_config is None:
    223         raise ValueError('No model found in config.')

/usr/local/lib/python3.6/dist-packages/keras/utils/io_utils.py in __getitem__(self, attr)
    300             else:
    301                 if self.read_only:
--> 302                     raise ValueError('Cannot create group in read only mode.')
    303                 val = H5Dict(self.data.create_group(attr))
    304         return val

ValueError: Cannot create group in read only mode.

有人可以帮我理解这种只读模式吗?如何加载此模型?

【问题讨论】:

标签: python tensorflow keras deep-learning


【解决方案1】:

这是在 Google Collab 上为您创建的 Git 要点示例:https://gist.github.com/kolygri/835ccea6b87089fbfd64395c3895c01f

据我所知:

您必须设置和定义模型的架构,然后使用 model.load_weights('alexnet_weights.h5')。

这是一个有用的 Github 对话链接,希望能帮助您更好地理解问题: https://github.com/keras-team/keras/issues/6937

【讨论】:

  • 如何“设置和定义模型的架构”?
  • 例如model = Sequential() model.add(layers.Dense(512, activation='relu', input_shape=input_shape))
【解决方案2】:

我遇到了类似的问题并通过这种方式解决了

存储graph\architecture 格式为JSONweights 格式为h5 格式

import json

# lets assume `model` is main model 
model_json = model.to_json()
with open("model_in_json.json", "w") as json_file:
    json.dump(model_json, json_file)

model.save_weights("model_weights.h5")

然后需要先load modelcreategraph\architectureload_weights在模型中

from keras.models import load_model
from keras.models import model_from_json
import json

with open('model_in_json.json','r') as f:
    model_json = json.load(f)

model = model_from_json(model_json)
model.load_weights('model_weights.h5')

【讨论】:

  • 对我来说,这个答案通过 JSON 解决“load_model”问题而不是像许多其他答案那样将 .h5 与模型混淆,从而填补了几个巨大的空白。现在这一切都走到了一起。谢谢!
【解决方案3】:

我使用callbacks.ModelCheckpoint 来保存权重,但我遇到了类似的错误。我发现有一个参数叫save_weights_only

如果我设置save_weights_only=True,那么当我使用 load_model() 在另一个进程中加载​​模型时,它会引发“无法在只读模式下创建组”。错误。

如果我设置save_weights_only=False(这是默认值),那么我可以使用 load_model() 加载模型并使用它进行预测,而无需先编译模型。

【讨论】:

    【解决方案4】:

    你可以使用model.save(model_path+'Model.h5')然后keras.models.load_model(model_path+'Model.h5'),这样你就不需要在加载权重之前构建和编译模型,因为model.save.h5文件中的dict中创建了架构。

    【讨论】:

      【解决方案5】:

      简单的解决方案是您必须以与保存模型相同的方式加载保存模型

      例如,您已经创建了这样的模型

      # Build the model
      
      model = Sequential()
      model.add(Dense(100, input_shape=(10,)))
      model.add(Activation('relu'))
      
      model.add(Dense(10))
      model.add(Activation('softmax'))
      
      model.compile(loss='categorical_crossentropy',
                    optimizer='adam',
                    metrics=['accuracy'])
      
      #fit the model
      model.fit(x_train, y_train,
                          batch_size=10,
                          epochs=5,
                          verbose=1,
                          validation_split=0.1)
      
      #save model
      model.save("model.h5")
      

      因此,如果您想加载此模型进行预测,您必须遵循相同的步骤

      from keras.models import load_model
      # Build the model
      
      model = Sequential()
      model.add(Dense(100, input_shape=(10,)))
      model.add(Activation('relu'))
      
      model.add(Dense(10))
      model.add(Activation('softmax'))
      
      model.compile(loss='categorical_crossentropy',
                    optimizer='adam',
                    metrics=['accuracy'])
      
      # load model
      model.load_weights('model.h5')
      
      prediction = model.predict( ''' data to predict ''')
      
      

      【讨论】:

      • 为什么导入 load_model 然后不使用呢?您的答案也使用了 load_weights 并且没有回答关于 load_model 的操作问题。
      猜你喜欢
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多