解决tf2.0中model.save()保存pb模型时cannot be saved because the input shapes have not been set.的报错

在进行保存模型时,TF2.0有三种保存方式,分别是model.save_weights('filepath');model.save('filepath',save_format='tf');tf.saved_model.save(model,'filepath')

三种方式都有各自的特点:

  • save_weights只保存模型权重,意味着当你要加载模型时,需要先搭建原来的模型,然后load一下参数从文件中,加载参数文件使用model.load_weights('filepath')。
  • model.save保存整个模型,包括模型参数,模型的输入输出,优化器的配置等,TF支持保存两种格式的文件:
  1. H5格式的文件,使用方式为model.save('path.h5'),h5格式的文件内容比较全,一般文件比较大。(注意:如果是用户自定义模型,采用的是subclassing方式创建的,则无法保存为H5格式的文件,会报错!)
  2. pb格式的文件,使用方式为model.save('path',save_format='tf'),pb格式的文件一般适合用来部署,文件的大小要小一点。
  • tf.saved_model.save(model,'filepath')保存整个模型,是TF2.0中支持的方法,一般也是用来模型部署的。模型加载预测起来比较麻烦一点 

 开始进入主题:

在model.save('filepath', save_format='tf')时出现以下错误信息:

解决tf2.0中model.save()保存pb模型时cannot be saved because the input shapes have not been set.的报错_第1张图片

信息显示没有定义input shape,按照一般情况,model会自动识别input shape但是显示好像并没有,可能是我的模型是自定义的关系,训练也是自定义所以无法自动识别出这个shape来。

完整的报错信息如下:

ValueError: Model <__main__.MyModel object at 0x00000216D2453F48> cannot be saved because the input shapes have not been set. Usually, input shapes are automatically determined from calling .fit() or .predict(). To manually set the shapes, call model._set_inputs(inputs).

根据显示信息,需要手动设置input的shape,查阅很多博客,并没有找到相似的问题,Stack Overflow有类似的,但没有得到解决~

经过不断尝试,终于找到了一种方法解决了这个问题,但可能不一定最优。以下是我的解决方法:

原始的模型创建是这样的:

解决tf2.0中model.save()保存pb模型时cannot be saved because the input shapes have not been set.的报错_第2张图片

修改之后的亚子是这样的:

解决tf2.0中model.save()保存pb模型时cannot be saved because the input shapes have not been set.的报错_第3张图片

 添加了一行,手动设置inputs的维度,内容和input_signature中的内容是一样的。

目前不知道这样修改的原因,可能与版本有关吧 tf2.0.0,如果有更好的方法也可以给我留言呦~感谢感谢。

你可能感兴趣的:(NLP学习,tensorflow)