4 votes

keras load model error trying to load a weight file containing 17 layers into a model with 0 layers

Je travaille actuellement sur le modèle vgg16 avec keras. Je peaufine le modèle vgg avec certaines de mes couches. Après avoir ajusté mon modèle (training), je sauvegarde mon modèle avec model.save('name.h5') . Il peut être sauvegardé sans problème. Cependant, lorsque j'essaie de recharger le modèle avec la fonction load_model le message d'erreur s'affiche :

Vous essayez de charger un fichier de poids contenant 17 couches dans un modèle avec 0 couches

Quelqu'un a-t-il déjà rencontré ce problème ? Ma version de keras est la 2.2.

Voici une partie de mon code ...

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')

En fait, je ne supprime pas le modèle puis load_model immédiatement, juste pour avoir montré mon problème.

0voto

AlexConfused Points 151

Il semble que ce problème soit lié à la forme_d'entrée de la première couche. J'ai rencontré ce problème avec une couche enveloppante (bidirectionnelle) qui n'avait pas de paramètre input_shape. Dans le code :

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

n'a pas fonctionné pour charger mon ancien modèle car l'input_shape n'est défini que pour la couche LSTM et non pour la couche externe. Au lieu de cela

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

a fonctionné parce que le calque Birectionnel enveloppant a maintenant un paramètre input_shape. Peut-être devriez-vous vérifier si le paramètre input_shape du réseau VGG est défini ou non, ou ajouter un seul paramètre couche_d'entrée à votre modèle avec la bonne forme_d'entrée paramètre.

0voto

Gaston Points 41

J'ai passé 6 heures à chercher une solution pour appliquer mon modèle de formation. Finalement, j'ai essayé VGG16 comme modèle et j'ai utilisé les poids h5 que j'ai entraînés moi-même et c'est génial !

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")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X