4 votes

Défaut de segmentation Keras sur load_model sous Linux et non sous Windows

J'ai prototypé un morceau de code Python d'apprentissage profond fonctionnant sous Windows et je n'arrive pas à le faire fonctionner sous Linux. J'ai identifié que le problème vient de load_model. Voici le morceau de code Python qui se comporte différemment sous Windows et sous Linux.

Les deux installations Keras ont été faites à partir du dépôt source github de l'équipe Keras car le format du modèle n'est pas reconnu par le paquetage standard de Keras, un patch a été fait très récemment pour le format des caractères dans le code source Github.

Vous avez une idée de ce qui se passe ?

Le code :

from keras.models import load_model, Model
import sys
import keras
import tensorflow as tf
import os
import platform

print("----------------------------------------------")
print("Operating system:")
print (os.name)
print(platform.system())
print(platform.release())
print("----------------------------------------------")
print("Python version:")
print(sys.version)
print("----------------------------------------------")
print("Tensorflow version: ", tf.__version__)
print("----------------------------------------------")
print("Keras version     : ", keras.__version__)
print("----------------------------------------------")

yolo_model = load_model("model.h5")

Sortie Windows :

Using TensorFlow backend.
----------------------------------------------
Operating system:
nt
Windows
7
----------------------------------------------
Python version:
3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)]
----------------------------------------------
Tensorflow version:  1.4.0
----------------------------------------------
Keras version     :  2.1.2
----------------------------------------------
2018-01-06 21:54:37.700794: I C:\tf_jenkins\home\workspace\rel-win\M\windows\PY\36\tensorflow\core\platform\cpu_feature_guard.cc:137] Your CPU supports instruc
ions that this TensorFlow binary was not compiled to use: AVX AVX2
C:\Users\David\AppData\Local\Programs\Python\Python36\lib\site-packages\keras-2.1.2-py3.6.egg\keras\models.py:252: UserWarning: No training configuration found
in save file: the model was *not* compiled. Compile it manually.

Sortie Linux :

Using TensorFlow backend.
----------------------------------------------
Operating system:
posix
Linux
4.9.0-5-amd64
----------------------------------------------
Python version:
3.5.3 (default, Jan 19 2017, 14:11:04) 
[GCC 6.3.0 20170118]
----------------------------------------------
Tensorflow version:  1.4.1
----------------------------------------------
Keras version     :  2.1.2
----------------------------------------------
----------------------------------------------
2018-01-06 21:47:58.099715: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX
Erreur de segmentation

Le français Erreur de segmentation signifie Défaut de segmentation

Merci pour votre aide !

Grenouille de verre

3voto

J'ai seulement trouvé une solution de contournement.

Comme le fichier du modèle était une conversion de données à partir d'un autre fichier de poids dans un autre format, je suis allé régénérer le modèle Keras pour la dernière version de Keras.

Maintenant ça marche.

Mais je ne sais toujours pas ce qui a causé le défaut de segmentation.

0voto

reox Points 1444

D'après ce que je sais, le défaut se produit lors de la création du modèle, mais je ne sais pas pourquoi. Je pourrais déboguer cela en sauvegardant le modèle et les poids indépendamment :

from keras.models import load_model
x = load_model('combined_model.h5')  # runs only on the source machine
with open('model.json', 'w') as fp:
     fp.write(x.to_json())
x.save_weights('weights.h5')

Sur l'autre machine, j'ai essayé de charger le modèle à partir du fichier JSON, mais j'ai obtenu le message suivant segmentation fault également :

from keras.models import model_from_json
with open('model.json', 'r') as fp:
    model = model_from_json(fp.read())  # segfaults here

S'il est possible de recréer simplement le modèle sur la machine cible en créant à nouveau le modèle séquentiel, vous pouvez simplement charger les poids dans le modèle :

from keras import Sequential
# ...
new_model = Sequential()
# [...] run your model creation here...
new_model.load_weights('weights.h5')

new_model.predict(...)  # this should work now

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