加载keras模型h5未知度量

2024-09-29 06:26:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我培训了keras CNN,监控以下指标:

METRICS = [
  TruePositives(name='tp'),
  FalsePositives(name='fp'),
  TrueNegatives(name='tn'),
  FalseNegatives(name='fn'), 
  BinaryAccuracy(name='accuracy'),
  Precision(name='precision'),
  Recall(name='recall'),
  AUC(name='auc'),
 ]

然后是model.compile:

 model.compile(optimizer='nadam', loss='binary_crossentropy',
         metrics=METRICS)

它工作得很好,我保存了我的h5型号(model.h5)

现在我已经下载了该模型,我想在其他脚本中使用它导入模型,包括:

 from keras.models import load_model
 model = load_model('model.h5')
 model.predict(....)

但在运行过程中,编译器返回:

 ValueError: Unknown metric function: {'class_name': 'TruePositives', 'config': {'name': 'tp', 'dtype': 'float32', 'thresholds': None}}

我应该如何处理这个问题

先谢谢你


Tags: name模型modelload指标cnnkerasmetrics
3条回答
custom_objects['METRICS'] = METRICS
model = load_model('model.h5', custom_objects=custom_objects)

当您有自定义指标时,您需要遵循稍微不同的方法

  1. 创建模型,训练并保存模型
  2. custom_objectscompile = False加载模型
  3. 最后用自定义的_对象编译模型

我在这里展示方法

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%

看起来您正在使用tensorflow教程。我也使用了这些精确的指标,也遇到了同样的问题。对我来说,有效的方法是用compile = False加载模型,然后用自定义度量编译它。然后您应该能够按预期使用model.predict(....)

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
             )

相关问题 更多 >