keras加载模型错误尝试将包含17个图层的权重文件加载到具有0个图层的模型中

时间:2018-06-18 15:50:11

标签: python model keras deep-learning

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

  

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

以前有人遇到过这个问题吗? 我的keras verion是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, 只是为了表明我的问题。

3 个答案:

答案 0 :(得分:0)

似乎此问题与第一层的 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

答案 1 :(得分:0)

我花了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")

答案 2 :(得分:0)

万一有人还在想知道这个错误:

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

model.fit_generator()

代替

model.fit()

保存之前。而且有效