用keras调用load_model时报错ValueError:

2019-07-08  本文已影响0人  枫丫头爱学习

出现该错误原因: 保存的model中包含了自定义的层(Custom Layer),导致加载模型的时候无法解析该Layer。参考https://github.com/keras-team/keras/issues/8612

以加入SelfAttention层为例

1. 在load_model函数中添加custom_objects参数,该参数接受一个字典,键值为自定义的层:
model = load_model(model_path, custom_objects={'AttLayer': AttLayer})  # 假设自定义的层的名字为AttLayer

解释:此处 第一个AttLayer 应该替换成打印模型我们看到的该层的名字,即所定义层的类名,如以加入SelfAttention模块为例。
在训练模型时,我们的用法是conv1 = SelfAttention(ch)(x)

from ...  import SelfAttention
attention = SelfAttention()
model = load_model(model_path, custom_objects={'SelfAttention': attention})  
2. 继续报错 ValueError: Unknown Layer:LayerName 这种形式,可尝试使用对象的方法,可能是keras版本不一样的问题,我使用的是keras 2.2.4用的是这个方法:
from keras.utils import CustomObjectScope
with CustomObjectScope({'SelfAttention': attention}):
    model = load_model('my_model.h5')
  1. 可能还会碰到的问题,在SelfAttention( )类定义中,初始化时应该给ch默认值,且需要与传入值一致,比如,层定义时我们对ch传入默认值
    编写自己的层,参考keras官方文档https://keras-cn.readthedocs.io/en/latest/layers/writting_layer/
class SelfAttention(Layer):

   def __init__(self, ch=256, **kwargs):
       super(SelfAttention, self).__init__(**kwargs)
       self.channels = ch
       self.filters_f_g = self.channels // 8
       self.filters_h = self.channels
       super(SelfAttention, self).__init__()

def build(self, input_shape):
def call(self, x):
def compute_output_shape(self, input_shape):

否则加载模型时会告诉你无法完成初始化类错误。

Type Error: __ init__() takes exactly 2 arguments (1 given ) 或者是 通道数维度不匹配等问题

上一篇下一篇

猜你喜欢

热点阅读