tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例

这篇文章主要介绍了tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例,具有很好的参考价值,希望对大家有所帮助。一起跟随想过来看看吧

升级到tf 2.0后, 训练的模型想转成1.x版本的.pb模型, 但之前提供的通过ckpt转pb模型的方法都不可用(因为保存的ckpt不再有.meta)文件, 尝试了好久, 终于找到了一个方法可以迂回转到1.x版本的pb模型.

Note: 本方法首先有些要求需要满足:

可以拿的到模型的网络结构定义源码

网络结构里面的所有操作都是通过tf.keras完成的, 不能出现类似tf.nn 的tensorflow自己的操作符

tf2.0下保存的模型是.h5格式的,并且仅保存了weights, 即通过model.save_weights保存的模型.

在tf1.x的环境下, 将tf2.0保存的weights转为pb模型:

如果在tf2.0下保存的模型符合上述的三个定义, 那么这个.h5文件在1.x环境下其实是可以直接用的, 因为都是通过tf.keras高级封装了,2.0版本和1.x版本不存在特别大的区别,我自己的模型是可以直接用的.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

import tensorflow as tf

import os

from nets.efficientNet import *

os.environ['CUDA_VISIBLE_DEVICES'] = '-1'

# 这个代码网上说需要加上, 如果模型里有dropout , bn层的话, 我测试过加不加结果都一样, 保险起见还是加上吧

tf.keras.backend.set_learning_phase(0)

 

# 首先是定义你的模型, 这个需要和tf2.0下一毛一样

inputs = tf.keras.Input(shape=(224, 224, 3), name='modelInput')

outputs = yourModel(inputs, training=False)

model = tf.keras.Model(inputs=inputs, outputs=outputs)

model.load_weights('save_weights.h5')

def freeze_session(session, keep_var_names=None, output_names=None, clear_devices=True):

  """

  Freezes the state of a session into a pruned computation graph.

 

  Creates a new computation graph where variable nodes are replaced by

  constants taking their current value in the session. The new graph will be

  pruned so subgraphs that are not necessary to compute the requested

  outputs are removed.

  @param session The TensorFlow session to be frozen.

  @param keep_var_names A list of variable names that should not be frozen,

             or None to freeze all the variables in the graph.

  @param output_names Names of the relevant graph outputs.

  @param clear_devices Remove the device directives from the graph for better portability.

  @return The frozen graph definition.

  """

  from tensorflow.python.framework.graph_util import convert_variables_to_constants

  graph = session.graph

  with graph.as_default():

    freeze_var_names = list(set(v.op.name for v in tf.global_variables()).difference(keep_var_names or []))

    output_names = output_names or []

    output_names += [v.op.name for v in tf.global_variables()]

    # Graph -> GraphDef ProtoBuf

    input_graph_def = graph.as_graph_def(add_shapes=True)

    if clear_devices:

      for node in input_graph_def.node:

        node.device = ""

    frozen_graph = convert_variables_to_constants(session, input_graph_def,

                           output_names, freeze_var_names)

    return frozen_graph

 

frozen_graph = freeze_session(tf.keras.backend.get_session(), output_names=[out.op.name for out in model.outputs])

tf.train.write_graph(frozen_graph, "model", "tf_model.pb", as_text=False)

运行成功后, 会在当前目录下生成一个model文件夹, 里面有生成的tf_model.pb文件, 至此, 我们就完成了将tf2.0下训练的模型转到tf1.x下的pb模型, 这样,就可以用这个pb模型做其它推理或者转tvm ncnn等模型转换工作.

这个转换的重点就是通过keras这个中间商来完成, 所以我们定义的模型就必须要满足这个中间商定义的条件

补充知识:tensorflow2.0降级及如何从别的版本升到2.0

代码实践《tensorflow实战GOOGLE深度学习框架》时,由于本机安装的tensorflow为2.0版本与配套书籍代码1.4的API不兼容,只得将tensorflow降级为1.4.0版本使用,降级方法如下

1 pip uninstall tensorflow

2 pip install tensorflow==1.14.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

验证

import tensorflow as tf
print(tf.version)

二 从别的版本升级到2.0

自动卸载与其相关包

pip uninstall tensorflow

安装某版本

pip install --no-cache-dir tensorflow==x.xx (此处填写2.0)

验证

以上这篇tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

 

 

### 回答1: 可以,示例代码如下:import tensorflow as tf# 定义模型 model = tf.keras.Sequential([ tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(10, activation='softmax') ])# 编译模型 model.compile( optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'] )# 保存模型 tf.saved_model.save(model, 'my_model') ### 回答2: 当使用TensorFlow构建和训练模型后,我们可以使用`tf.saved_model.save()`方法来保存模型。下面是一个示例代码,展示如何使用`tf.saved_model.save()`来保存模型: ``` import tensorflow as tf # 构建模型 inputs = tf.keras.Input(shape=(32,)) outputs = tf.keras.layers.Dense(10)(inputs) model = tf.keras.Model(inputs=inputs, outputs=outputs) # 训练模型 model.compile(optimizer='adam', loss='mse') model.fit(x_train, y_train, epochs=10) # 保存模型 saved_model_path = "./saved_model" tf.saved_model.save(model, saved_model_path) ``` 在这个示例中,我们首先使用TensorFlow构建了一个简单的模型。然后,我们使用`compile()`方法来编译模型,并使用`fit()`方法来训练模型。 接下来,我们使用`tf.saved_model.save()`方法来保存模型。该方法接收两个参数:要保存模型对象和保存路径。在这个示例中,我们将模型保存到当前目录下的`saved_model`文件夹中。 保存模型后,`saved_model`文件夹中包含一个包含模型架构、权重和训练配置的saved_model.pb文件,以及一个variables文件夹,其中包含所有模型的变量。 通过使用`tf.saved_model.load()`方法,我们可以加载保存模型并继续使用它进行推理或微调训练。 ### 回答3: 当使用TensorFlow的`tf.saved_model.save()`方法来保存模型时,我们需要先定义一个模型,并将其保存到SavedModel格式。 下面是一个示例代码,展示了如何使用`tf.saved_model.save()`来保存一个简单的线性回归模型: ```python import tensorflow as tf # 定义模型 class LinearModel(tf.Module): def __init__(self): self.w = tf.Variable(2.0, name='weight') self.b = tf.Variable(1.0, name='bias') def __call__(self, x): return self.w * x + self.b # 创建一个模型实例 model = LinearModel() # 创建一个tf.Tensor对象 x = tf.constant(3.0) # 使用模型进行预测 y = model(x) # 为模型创建一个签名函数 @tf.function(input_signature=[tf.TensorSpec(shape=(), dtype=tf.float32)]) def predict(input_x): return model(input_x) # 将模型保存到SavedModel格式 tf.saved_model.save(model, 'linear_model') # 加载SavedModel loaded_model = tf.saved_model.load('linear_model') # 使用加载的模型进行预测,结果与之前的模型一致 loaded_y = loaded_model(x) print(loaded_y) # 输出为 tf.Tensor(7.0, shape=(), dtype=float32) ``` 在这个示例代码中,我们首先定义了一个简单的线性回归模型,然后创建了一个模型实例并使用它进行了预测。接下来,我们为模型创建了一个签名函数,并使用`tf.saved_model.save()`方法将整个模型保存到SavedModel格式。最后,我们加载了保存模型并使用它进行了预测,验证了加载的模型的正确性。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值