2017-05-15 2 views
1

Il y a quelques semaines, j'ai formé un réseau de neurones convolutionnels (CNN) en utilisant Keras avec le backend Theano, et je l'ai enregistré sous forme de fichier h5.Modifier le fichier h5 pour corriger l'erreur avec Keras I/O

Mais aujourd'hui, quand j'essayé de l'ouvrir, je suis arrivé cette erreur pour la couche BatchNormalization, de Théano bn.py fichier:

ValueError: epsilon must be at least 1e-5, got 9.99999974738e-06

Alors voici mes questions:

  1. Puis-je faire quelque chose avec Keras pour résoudre ce problème?
  2. Si la première question n'a pas de réponse, comment puis-je modifier un fichier h5 afin de modifier manuellement cette valeur?

Répondre

1

Voici une solution temporaire à ce problème. Le bn.py fichier Théano a deux tests similaires depuis la dernière version (autour des lignes 220 et 380), et ces tests sont responsables du problème:

if epsilon < 1e-5: 
    raise ValueError("epsilon must be at least 1e-5, got %s" % str(epsilon)) 

Une solution temporaire serait de remplacer l'augmentation par une afféterie :

if epsilon < 1e-5: 
    epsilon = 1e-5 

Ce n'est pas idéal, mais cela permet de lire les anciens fichiers. Ne pas oublier d'annuler cette modification par la suite.

1

Publier mon étui pour référence future parce que duckduckgo.com m'a amené ici.

Dans mon cas, je n'ai pas eu la même erreur que OP, mais j'ai eu le même problème d'avoir un fichier h5 qui a été formé et enregistré mais ne chargerait pas à cause de keras issue 2814: TypeError: arg 5 (closure) must be tuple. Je fini de modifier temporairement le code keras dans la fonction de désérialisation lambda keras.layers.core.Lambda.from_config de

elif function_type == 'lambda': 
     # Unsafe deserialization from bytecode 
     function = func_load(config['function'], globs=globs) 

à

elif function_type == 'lambda': 
     # Unsafe deserialization from bytecode 
     if 'my_lambda_name' in config['function'][0]: 
      print('bypassing lambda function') 
      function = lambda x: x 
     else: 
      function = func_load(config['function'], globs=globs) 

Cette contourne la fonction de lambda incriminé. Cela fonctionne pour moi parce que cette fonction lambda spécifique dans ce h5 spécifique agissait simplement comme lambda x: x même si c'était un peu plus compliqué que cela.

Puis j'ai écrit un petit script qui a chargé le modèle et enregistré dans un nouveau fichier (avec la couche lambda contournée)

from keras.models import load_model 
print('fixing file') 
model = load_model('path/to/file.h5') 
model.save('path/to/file.fixed.h5') 
print('fixed')