Load keras model h5 unknown metrics

后端 未结 3 939
陌清茗
陌清茗 2021-01-26 02:59

I have trained a keras CNN monitoring the metrics as follow:

METRICS = [
  TruePositives(name=\'tp\'),
  FalsePositives(name=\'fp\'),
  TrueNegatives(name=\'tn\'         


        
相关标签:
3条回答
  • 2021-01-26 03:37
    custom_objects['METRICS'] = METRICS
    model = load_model('model.h5', custom_objects=custom_objects)
    
    0 讨论(0)
  • 2021-01-26 03:39

    It looks like you are playing with a tensorflow tutorial. I also used these exact metrics and had the same problem. What worked for me was to load the model with compile = False and then compile it with the custom metrics. Then you should be able to use model.predict(....) as expected.

    import keras
    
    model = keras.models.load_model('model.h5', compile = False)
    
    METRICS = [
          keras.metrics.TruePositives(name='tp'),
          keras.metrics.FalsePositives(name='fp'),
          keras.metrics.TrueNegatives(name='tn'),
          keras.metrics.FalseNegatives(name='fn'), 
          keras.metrics.BinaryAccuracy(name='accuracy'),
          keras.metrics.Precision(name='precision'),
          keras.metrics.Recall(name='recall'),
          keras.metrics.AUC(name='auc'),
    ]
    
    model.compile(optimizer = keras.optimizers.Adam(learning_rate=1e-4),
                  loss = 'binary_crossentropy',
                  metrics = METRICS
                 )
    
    0 讨论(0)
  • 2021-01-26 03:41

    When you have custom metrics you need to follow slightly different approach.

    1. Create model, train and save the model
    2. Load the model with custom_objects and compile = False
    3. Finally compile the model with the custom_objects

    I am showing the approach here

    import tensorflow as tf
    from tensorflow import keras
    mnist = tf.keras.datasets.mnist
    
    (x_train, y_train),(x_test, y_test) = mnist.load_data()
    x_train, x_test = x_train / 255.0, x_test / 255.0
    
    # Custom Loss1 (for example) 
    #@tf.function() 
    def customLoss1(yTrue,yPred):
      return tf.reduce_mean(yTrue-yPred) 
    
    # Custom Loss2 (for example) 
    #@tf.function() 
    def customLoss2(yTrue, yPred):
      return tf.reduce_mean(tf.square(tf.subtract(yTrue,yPred))) 
    
    def create_model():
      model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(input_shape=(28, 28)),
        tf.keras.layers.Dense(512, activation=tf.nn.relu),  
        tf.keras.layers.Dropout(0.2),
        tf.keras.layers.Dense(10, activation=tf.nn.softmax)
        ])
      model.compile(optimizer='adam',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy', customLoss1, customLoss2])
      return model 
    
    # Create a basic model instance
    model=create_model()
    
    # Fit and evaluate model 
    model.fit(x_train, y_train, epochs=5)
    
    loss, acc,loss1, loss2 = model.evaluate(x_test, y_test,verbose=1)
    print("Original model, accuracy: {:5.2f}%".format(100*acc)) # Original model, accuracy: 98.11%
    
    # saving the model
    model.save('./Mymodel',save_format='tf')
    
    # load the model
    loaded_model = tf.keras.models.load_model('./Mymodel',custom_objects={'customLoss1':customLoss1,'customLoss2':customLoss2},compile=False)
    
    # compile the model
    loaded_model.compile(optimizer='adam',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy', customLoss1, customLoss2])
    
    # loaded model also has same accuracy, metrics and loss
    loss, acc,loss1, loss2 = loaded_model.evaluate(x_test, y_test,verbose=1)
    print("Loaded model, accuracy: {:5.2f}%".format(100*acc)) #Loaded model, accuracy: 98.11%
    
    0 讨论(0)
提交回复
热议问题