keras调用load_model时报错ValueError: Unknown Layer:LayerName, ValueError: Unknown metric function:recall

本文解决Keras模型加载时遇到的错误,包括因自定义层引起的解析问题和自定义评估函数、损失函数导致的加载失败。提供了解决方案,如使用custom_objects参数和实现get_config方法。

出现该错误原因

因为保存的model中包含了自定义的层(Custom Layer),导致加载模型的时候无法解析该Layer。
参考can not load_model() if my model contains my own Layer

解决方法

在load_model函数中添加custom_objects参数,该参数接受一个字典,键值为自定义的层:

model = load_model(model_path, custom_objects={'AttLayer': AttLayer})  # 假设自定义的层的名字为AttLayer

若添加该语句后不报错则解决问题。
若出现新的Error:init() got an unexpected keyword argument ‘name’
If you use custom args for your model, then implement get_config() method. It would help you save all necessary arguments with your model.
解决该Error,可以参照keras-team的写法,在自定义的层中添加get_config函数,该函数定义形如:

def get_config(self):    
    config = {
        'attention_dim': self.attention_dim    
    }    
    base_config = super(AttLayer, self).get_config()    
    return dict(list(base_config.items()) + list(config.items()))

其中,config中定义的属性是自定义层中__init__函数的参数,__init__函数如下:

def __init__(self, attention_dim, **kwargs):    
    self.init = initializers.get('normal')    
    self.supports_masking = True    
    self.attention_dim = attention_dim    
    super(AttLayer, self).__init__()

注意:
1、__init__函数中需添加**kwargs参数

2、只需要将__init__函数的参数写入config属性中,__init__函数体中的内容不必加进去,get_config函数其他部分也无需改动,否则会报错

原文:https://blog.youkuaiyun.com/larry233/article/details/88569797

keras 自定义评估函数和损失函数loss训练模型后加载模型出现ValueError: Unknown metric function:precision,recall

有时候训练模型,现有的评估函数并不足以科学的评估模型的好坏,这时候就需要自定义一些评估函数,比如样本分布不均衡是准确率accuracy评估无法判定一个模型的好坏,这时候需要引入精确度和召回率作为评估标准,不幸的是keras没有这些评估函数。以下是参考别的文章摘取的两个自定义评估函数

召回率:

def recall(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
    recall = true_positives / (possible_positives + K.epsilon())
    return recall

精确度:

def precision(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
    precision = true_positives / (predicted_positives + K.epsilon())
    return precision

自定义了评估函数,一般在编译模型阶段加入即可:

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy', precision, recall])

自定义了损失函数focal_loss一般也在编译阶段加入:

 model.compile(optimizer=Adam(lr=0.0001), loss=[focal_loss], metrics=['accuracy',fbeta_score] )

其他的没有特别要注意的点,直接按照原来的思路训练一版模型出来就好了,关键的地方在于加载模型这里,自定义的函数需要特殊的加载方式,不然会出现加载没有自定义函数的问题:ValueError: Unknown loss function:focal_loss

解决方案:

model_name = 'test_calssification_model.h5'
model_dfcw = load_model(model_name,
                        custom_objects={'precision: precision,'recall':recall,'fbeta_score':fbeta_score, 'focal_loss':focal_loss})

注意点:将自定义的损失函数和评估函数都加入到custom_objects里,以上就是在自定义一个损失函数从编译模型阶段到加载模型阶段出现的所有的问题。

原文:https://blog.youkuaiyun.com/aojue1109/article/details/88058965

<think>好的,我现在需要解决用户在加载Keras模型遇到的“Unknown layer: Functional”的ValueError问题。用户已经尝试过使用custom_objects参数注册自定义层,但可能还有其他原因导致这个错误。 首先,根据用户提供的引用[^1]和[^2],常见的解决办法是在load_model提供custom_objects字典,将自定义层的名称与类对应。例如,如果自定义层是AttLayer或SpatialPyramidPooling,就需要在字典中指明。但用户遇到的错误是“Functional”层未被识别,这让我想到Functional可能是一个自定义层或者模型结构相关的问题。 接下来,我需要检查用户是否正确地注册了所有自定义层。用户可能在使用Keras的函数式API(Functional API)构建模型,但错误提示中的“Functional”并不是一个标准的层名称,这可能意味着模型保存或加载的结构问题。例如,用户可能错误地将整个模型当作自定义层来处理,或者保存模型的方式不正确。 另外,根据引用[^3],Keras的模型由不同的层构成,如果模型中包含自定义层,加载必须显式提供这些层的定义。如果用户的自定义层名为Functional,那需要确认该层的类是否在custom_objects中正确注册。但通常,Functional API构建的模型本身不需要作为自定义层注册,因此这里可能存在误解。 还有一种可能是模型保存使用了Keras的模型子类化(Model subclassing),而加载没有正确重建模型结构。这种情况下,即使使用custom_objects,也可能需要先确保模型类本身被正确导入和定义。 可能的解决方案步骤包括: 1. 确保所有自定义层都在custom_objects中正确注册,包括可能的嵌套层。 2. 检查模型保存是否使用了正确的API,比如使用model.save()而不是保存架构和权重分开。 3. 确认加载模型Keras版本与保存一致,避免版本不兼容。 4. 如果使用了自定义模型类(而不仅仅是层),可能需要更复杂的注册方法。 需要提醒用户检查这些方面,并提供具体的代码示例,例如如何定义和注册自定义层,以及正确加载模型的代码。</think>### 解决Keras加载模型Unknown layer: Functional”的ValueError问题 当使用`keras.models.load_model`加载模型出现`ValueError: Unknown layer: Functional`,通常是因为模型中包含自定义层或使用了特殊结构,但未在加载正确注册。以下是逐步解决方案: --- #### **步骤1:确认是否包含自定义层** - 如果模型包含**自定义层**(例如用户自己编写的层类),必须在加载通过`custom_objects`参数注册该层。例如: ```python from keras.models import load_model from your_module import Functional # 导入自定义层类 model = load_model('model.h5', custom_objects={'Functional': Functional}) ``` 这里`Functional`应替换为实际的自定义层类名[^1][^2]。 --- #### **步骤2:检查模型保存方式** - 如果模型是通过**函数式API(Functional API)**构建的,通常不需要注册自定义层,除非模型中包含自定义层。但错误提示中的`Functional`可能暗示保存或加载的结构异常。 - 确保模型保存使用`model.save('model.h5')`,而非仅保存权重或架构[^3]。 --- #### **步骤3:版本兼容性检查** - 确保加载模型使用的**Keras/TensorFlow版本**与保存一致。不同版本的层定义可能导致兼容性问题。 --- #### **步骤4:复杂场景处理** - **子类化模型(Subclassed Model)**:如果模型是通过继承`keras.Model`自定义的类(而非函数式API或Sequential),则加载需要先实例化模型并手动加载权重: ```python model = YourModelClass() # 重新实例化模型 model.load_weights('model_weights.h5') ``` 这种情况下,直接使用`load_model`可能不可行。 --- #### **代码示例** 假设自定义层名为`Functional`: ```python # 自定义层定义(例如在自定义层文件中) from tensorflow.keras.layers import Layer class Functional(Layer): def __init__(self, **kwargs): super(Functional, self).__init__(**kwargs) def call(self, inputs): return inputs * 2 # 示例操作 # 加载模型注册该层 from tensorflow.keras.models import load_model model = load_model('model.h5', custom_objects={'Functional': Functional}) ``` --- #### **常见错误排查** 1. **层名不一致**:`custom_objects`字典中的键必须与保存模型层的名称完全一致(区分大小写)。 2. **依赖缺失**:确保自定义层的定义在加载模型可被访问(例如通过导入)。 ---
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值