Unknown layer: TCN 关于加载自己定义类和导入tcn模型的问题
报错合集:
- ValueError: Unknown layer: TCN
- The added layer must be an instance of class Layer. Found: <tcn.tcn.TCN object at 0x000001F72743BDC8>
1、发现问题
跑关于TCN模型的时候,我将跑完后的模型save为“.h5”文件,然后写前端,实现选择不同模型做不同时间序列预测,然后在执行
model_tcn=load_model(model_path)
遇到了报错
File "S:\physon\envs\tensorflow\lib\site-packages\keras\utils\generic_utils.py", line 140, in deserialize_keras_object
': ' + class_name)
ValueError: Unknown layer: TCN
Unknown layer: TCN
原因是加进了未知层,然后我开始了探索:经过分析,主要有下面几个原因,现已解决,记录下来方便后面查找:
2、解决问题
第一步 添加自定义层
解决方案:我首先查询如何添加自定义层,在load函数里面添加“custom_objects”属性:
model_tcn=load_model(model_path,custom_objects={'TCN':TCN})
注意,这里的TCN根据自己实际情况替换,写成你自己定义的层名,model_path是自己的模型位置
修改,运行,等待。。。。漂亮!
报错: The added layer must be an instance of class Layer
File "S:\physon\envs\tensorflow\lib\site-packages\keras\engine\sequential.py", line 133, in add
'Found: ' + str(layer))
TypeError: The added layer must be an instance of class Layer. Found: <tcn.tcn.TCN object at 0x000001F72743BDC8>
第二步 检查tf.keras和keras模块
网上找到的原因:使用tf.keras和keras模块,或出现使用tensorflow.python.keras方式引用和keras引用混合,就会出现这个错误
解决方案:删除keras前面的tf或tensorflow,可参照链接: 点我.
修改,运行,等待。。。。漂亮,还是报第一步的错,检查后我没import过tensorflow啊,接着找,最后!通过查看tcn的源码文件tcn.py发现,原来tcn是基于tensorflow的,怪不得!
第三步 检查修改load函数
既然tcn是基于tensorflow那就应该使用tensorflow的导入模型方式
解决方案:导入tensorflow,在load_model 函数前面加上*tf.keras.models.*如下
import tensorflow as tf
model_tcn=tf.keras.models.load_model(model_path,custom_objects={'TCN':TCN})
修改,运行,等待。。。。它活过来了!终于解决了!!!
记录自己问题的,有不对的地方欢迎大佬指正!