【问题标题】:keras load model error trying to load a weight file containing 17 layers into a model with 0 layerskeras 加载模型错误尝试将包含 17 层的权重文件加载到具有 0 层的模型中
【发布时间】:2018-11-27 12:30:55
【问题描述】:

我目前正在使用 keras 开发 vgg16 模型。 我用我的一些层微调 vgg 模型。 拟合模型(训练)后,我将模型保存为 model.save('name.h5')。 它可以毫无问题地保存。 但是,当我尝试使用load_model 函数重新加载模型时,它会显示错误:

您正在尝试将包含 17 层的权重文件加载到模型中 0层

以前有人遇到过这个问题吗? 我的 keras 版本是 2.2。

这是我的代码的一部分...

from keras.models import load_model
vgg_model = VGG16(weights='imagenet',include_top=False,input_shape=(224,224,3))    
global model_2
model_2 = Sequential()
for layer in vgg_model.layers:
    model_2.add(layer)
for layer in model_2.layers:
    layer.trainable= False
model_2.add(Flatten())
model_2.add(Dense(128, activation='relu'))
model_2.add(Dropout(0.5))
model_2.add(Dense(2, activation='softmax'))
model_2.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model_2.fit(x=X_train,y=y_train,batch_size=32,epochs=30,verbose=2)
model_2.save('name.h5')
del model_2
model_2 = load_model('name.h5')

其实我并没有立即删除模型然后load_model, 只是为了显示我的问题。

【问题讨论】:

  • 我可以在我的机器上毫无问题地运行您的代码(当然,没有合适的部分)。这是一个奇怪的错误...您确定这是您使用的确切代码吗?你在 Anaconda 上使用 Keras 吗?

标签: python model keras deep-learning


【解决方案1】:

看来这个问题和第一层的input_shape参数有关。我在没有 input_shape 参数集的包装层(双向)上遇到了这个问题。在代码中:

model.add(Bidirectional(LSTM(units=units, input_shape=(None, feature_size)), merge_mode='concat'))

不适用于加载我的旧模型,因为 input_shape 仅针对 LSTM 层而不是外部层定义。而是

model.add(Bidirectional(LSTM(units=units), input_shape=(None, feature_size), merge_mode='concat'))

之所以起作用,是因为包装双向层现在有一个 input_shape 参数。也许您应该检查是否设置了 VGG net input_shape 参数,或者您应该使用正确的 input_shape 参数将单个 input_layer 添加到模型中。

【讨论】:

    【解决方案2】:

    我花了 6 个小时四处寻找解决方案.. 应用我训练有素的模型。 最后我尝试了 VGG16 作为模型并使用我自己训练的 h5 权重,太棒了!

    weights_model='C:/Anaconda/weightsnew2.h5'  # my already trained weights .h5
    vgg=applications.vgg16.VGG16()
    cnn=Sequential()
    for capa in vgg.layers:
       cnn.add(capa)
    cnn.layers.pop()
    for layer in cnn.layers:
       layer.trainable=False
    cnn.add(Dense(2,activation='softmax'))  
    
    cnn.load_weights(weights_model)
    
    def predict(file):
       x = load_img(file, target_size=(longitud, altura)) 
       x = img_to_array(x)                            
       x = np.expand_dims(x, axis=0)
       array = cnn.predict(x)     
       result = array[0]
       respuesta = np.argmax(result) 
       if respuesta == 0:
          print("Gato")
       elif respuesta == 1:
          print("Perro")
    

    【讨论】:

    • 你能详细说明你的代码是如何解决这个人提出的问题的吗?
    • 是的,我曾经遇到过同样的错误“keras 加载模型错误试图将包含 17 层的权重文件加载到具有 0 层的模型中”,因为它看起来是 Load_model 中的一种 2bug来自 Keras 的函数。但是,如果不是 load_model="file" 你定义模型,然后加载权重。它有效。问题发生在你尝试加载模型时。
    【解决方案3】:

    如果有人仍然想知道这个错误:

    我遇到了同样的问题,花了几天时间弄清楚是什么原因造成的。我在另一个可以运行的系统上保存了我的整个代码和数据集的副本。我注意到这与训练有关,因为如果不训练我的模型,保存和加载是没有问题的。 我的系统之间的唯一区别是,我在我的主系统上使用了 tensorflow-gpu,因此,tensorflow 基础版本略低一些(1.14.0 而不是 2.2.0)。所以我所要做的就是使用

    model.fit_generator()
    

    而不是

    model.fit()
    

    在保存之前。它有效

    【讨论】:

      猜你喜欢
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 2019-06-12
      • 2022-07-23
      • 2020-01-25
      • 1970-01-01
      • 2020-06-24
      相关资源
      最近更新 更多