tensorflow2自定义模型保存的坑(tf.saved_model.save以及自定义GAN)

今天自己用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是主要的警告

针对这个警告,尝试了几次都无法纠正,不过能运行就好

`model.save()`是TensorFlow 1.x中的函数,用于直接将Keras模型及其权重保存为HDF5文件或者序列化的Python对象,而`tf.saved_model.save()`则是TensorFlow 2.x中用于保存TF 2.0模型(包括函数式、子类化等)的官方方法,它将模型转换为更标准的SavedModel格式,支持多种平台和服务部署。 如果你想将一个Keras模型从`model.save()`改写为`tf.saved_model.save()`,你需要按照以下步骤操作: 1. 首先,确保你的Keras模型是在TF 2.x环境中定义的。如果是在TF 1.x中定义的,你需要将其升级到TF 2.x,例如通过`tf.keras.models.load_model('path_to_hdf5_file')`加载模型,然后继续在TF 2.x环境中操作。 2. 使用`tf.function`装饰器将模型的前向传播函数(如`__call__`)转换为可序列化的图形式。这对于函数式或子类化模型来说通常不需要做太多改变,因为它默认是函数式的。 ```python @tf.function(input_signature=[tf.TensorSpec(shape=(None,), dtype=tf.float32)]) def predict_function(inputs): return model(inputs) ``` 3.模型转换为SignatureDefs,这是SavedModel的核心部分,定义了模型的输入和输出。可以使用`tf.saved_model.build_signature_def()`创建一个或多个SignatureDef实例。 4. 最后,使用`tf.saved_model.save(model, export_dir)`将模型及其SignatureDefs保存到指定的export_dir(例如'/home/pi/Magic/sex_model_saved_model'): ```python signature = tf.saved_model.build_signature_def( inputs={'input': tf.saved_model.utils.build_tensor_info(inputs)}, outputs={'output': tf.saved_model.utils.build_tensor_info(predict_function(inputs))}, method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME) builder = saved_model_builder.SavedModelBuilder(export_dir) builder.add_meta_graph_and_variables( sess=None, tags=['serve'], signature_def_map={ 'predict': signature }) builder.save() ``` 记住,在TF 2.x中,你还需要处理好变量管理,特别是当你的模型包含了变量时。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值