具有keras和tensorflow_addons层的tensorflow模型未加载

问题描述

我已经从tensorflow_addons训练了一个具有keras层和weight_normalization层的模型。这是我训练并以张量流文件格式保存的模型:

import tensorflow as tf
import tensorflow.keras as tk
import tensorflow_addons as tfa

model = tf.keras.Sequential([
    tf.keras.layers.Input((X_train.shape[1]-1,)),tf.keras.layers.Batchnormalization(),tf.keras.layers.Dropout(0.2),tfa.layers.Weightnormalization(tf.keras.layers.Dense(2048,activation="relu")),tf.keras.layers.Dropout(0.5),tfa.layers.Weightnormalization(tf.keras.layers.Dense(1048,tfa.layers.Weightnormalization(tf.keras.layers.Dense(206,activation="sigmoid")),])

(并且没有自定义指标)

from keras.callbacks import ModelCheckpoint,EarlyStopping

# autosave best Model
best_model = ModelCheckpoint("model",monitor='val_accuracy',mode='max',verbose=0,save_best_only=True)

earlystop = EarlyStopping(monitor = 'val_accuracy',patience = 15,mode = 'max',verbose = 1,restore_best_weights = True)

callbacks = [best_model,earlystop]

model.compile(loss= 'binary_crossentropy',optimizer= 'Adam',metrics= ['accuracy'])
history = model.fit(X_res,y_res,epochs=100,verbose= 2,validation_data=(X_val[X_val.columns[1:]],y_val[y_val.columns[1:]]),callbacks=callbacks)

但是当我加载模型时,它返回一个错误

model = tk.models.load_model("../input/model")

--------------------------------------------------- ---------------------------- KeyError Traceback(最近的呼叫 最后) 2返回 3 ----> 4个模型= tk.models.load_model(“ ../ input / model-custom”,custom_objects = {'__ inference_dense_layer_call_fn_1126407':f1})

/opt/conda/lib/python3.7/site-packages/tensorflow/python/keras/saving/save.py 在load_model中(文件路径,custom_objects,编译,选项) 185 if isinstance文件路径,six.string_types): 第186章 -> 187返回saved_model_load.load(文件路径,编译,选项) 188 189提高IOError(

/opt/conda/lib/python3.7/site-packages/tensorflow/python/keras/saving/saved_model/load.py 加载中(路径,编译,选项) 119 120模型= tf_load.load_internal( -> 121路径,options = options,loader_cls = KerasObjectLoader) 122 123#pylint:disable = protected-access

/opt/conda/lib/python3.7/site-packages/tensorflow/python/saved_model/load.py 在load_internal(export_dir,标签,选项,loader_cls)中 631尝试: 632 = loader_cls(object_graph_proto,Saved_model_proto,export_dir, -> 633个ckpt_options) 634除了errors.NotFoundError作为err: 第635章;

/opt/conda/lib/python3.7/site-packages/tensorflow/python/keras/saving/saved_model/load.py 在 init (自身,* args,** kwargs)中 192 self._models_to_reconstruct = [] 193 -> 194超级(KerasObjectLoader,self)。初始化(* args,** kwargs) 195 196#现在,节点对象已完全加载,并且检查点已

/opt/conda/lib/python3.7/site-packages/tensorflow/python/saved_model/load.py 在 init (自身,object_graph_proto,Saved_model_proto,export_dir, ckpt_options) 128个self._concrete_functions [name] = _WrapperFunction(concrete_function) 129 -> 130 self._load_all() 131 self._restore_checkpoint() 132

/opt/conda/lib/python3.7/site-packages/tensorflow/python/keras/saving/saved_model/load.py 在_load_all() 216 217#加载所有其他节点和功能。 -> 218超级(KerasObjectLoader,self)._ load_all() 219 220#完成图层和模型的设置。有关更多信息,请参见函数文档字符串。

/opt/conda/lib/python3.7/site-packages/tensorflow/python/saved_model/load.py 在_load_all() 139 def _load_all(个体): 140“”“从SavedModel及其边缘加载所有节点和函数。”“” -> 141 self._load_nodes() 142 self._load_edges() 143#Todo(b / 124045874):捕获函数功能受到限制

/opt/conda/lib/python3.7/site-packages/tensorflow/python/saved_model/load.py 在_load_nodes中(自己) 281#界面。 282继续 -> 283个节点,setter = self._recreate(proto,node_id) 284个节点[node_id] =节点 285 node_setters [node_id] = setter

/opt/conda/lib/python3.7/site-packages/tensorflow/python/keras/saving/saved_model/load.py 在_recreate(self,proto,node_id)中 237 obj._handle_name = proto.variable.name +':0'#pylint:disable =受保护的访问 238其他: -> 239个obj,setter = super(KerasObjectLoader,self)._ recreate(proto,node_id) 240返回obj,setter 241

/opt/conda/lib/python3.7/site-packages/tensorflow/python/saved_model/load.py 在_recreate(self,proto,node_id)中 391(如果不在工厂) 392提高ValueError(“未知的Savedobject类型:%r”%种类) -> 393返回出厂状态 394 395 def _recreate_user_object(self,proto,node_id):

/opt/conda/lib/python3.7/site-packages/tensorflow/python/saved_model/load.py 在()中 380 lambda:self._recreate_user_object(proto.user_object,node_id)), 381“ asset”:lambda:self._recreate_asset(proto.asset), -> 382“ function”:lambda:self._recreate_function(proto.function), 383“ bare_concrete_function”:functools.partial( 384 self._recreate_bare_concrete_function,

/opt/conda/lib/python3.7/site-packages/tensorflow/python/saved_model/load.py 在_recreate_function中(自己,原型) 419 def _recreate_function(self,proto): (420)第420章 -> 421个原型,self._concrete_functions),setattr 422 423 def _recreate_bare_concrete_function(self,proto):

/opt/conda/lib/python3.7/site-packages/tensorflow/python/saved_model/function_deserialization.py 在recreate_function中(保存的功能,具体的功能) 259 concrete_function_objects = [] savered_function.concrete_functions中的Concrete_function_name为260: -> 261 concrete_function_objects.append(concrete_functions [concrete_function_name]) 262 263 for concrete_function_objects中的cf:

KeyError:'__inference_dense_layer_call_fn_1126407'

能帮我正确加载模型吗?谢谢

解决方法

我怀疑您分别安装了kerastensorflow;我曾与tfa合作,从未遇到过有关此类加载问题的问题;

实际上,您在这里通过tensorflow导入了所有内容:

import tensorflow as tf
import tensorflow.keras as tk
import tensorflow_addons as tfa

但是在这里,您通过普通的keras加载回调:

from keras.callbacks import ModelCheckpoint,EarlyStopping

为了首先确保您确实遇到加载模型问题,请确保每个导入都是通过tensorflow.keras完成的(我希望问题一经消失,问题就会完全消失)。

替换

from keras.callbacks import ModelCheckpoint,EarlyStopping

具有:

from tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping

总而言之,使用新的导入内容(全部来自tensorflow.keras)从头进行重新培训,然后检查是否重现了问题。