用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')
- 可能还会碰到的问题,在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 ) 或者是 通道数维度不匹配等问题