今天自己用tf2搭建框架完成PassGAN网络,终于把模型和训练算法都完成了,效果也不错的时候,突然发现使用tf.saved_model.save保存模型会报错,而且错误很离谱,基本上无法debug的那种,令人十分头疼。
首先介绍一下代码的大致结构,GAN网络中生成器和判别器都是自己定义的,并且使用到了自定义的layer: 训练时可以使用tf.train.Checkpoint的保存方法,即使中断训练,可以重新加载后继续训练。但是这个方法不太方便,需要对源代码有了解,因此就可以使用tf.saved_model,这可以跨语言使用。
另外,如果没有使用自定义的layer,可以用keras的sequential来封装,这样可以使用keras.model.save保存成.h5的格式,更加方便。
就是因为自己使用了两个自定义层,导致出现了许多bug
这里先写的是第一个错误:
报错显示有一个范围是未知的 也就是None,这时候我对生成器和判别器前加上一行代码: 这个是查阅官方文档后得到的,具体文档还是有点复杂的,大致意思是自定义模型在保存时需要用tf.function修饰部分函数,否则恢复后无法使用对应的函数。同时也制定了输入的类型和shape 文档网址: https://tensorflow.google.cn/api_docs/python/tf/saved_model/save?hl=en
然后会显示第二个错误: 这里显示pred这个变量的类型不对,经过我仔细检查后发现是,调用一个块的时候,多加一个参数,但是编译器没有在调用处报错,结果一直没有发现,删除后代码可以正常运行,但是会报一个警告:
Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version是主要的警告
针对这个警告,尝试了几次都无法纠正,不过能运行就好
|