如何使用 TF2 将加载的 h5 模型正确保存到 pb
how to properly saving loaded h5 model to pb with TF2
我加载了一个已保存的 h5 模型并想将模型保存为 pb。
在训练期间使用 tf.keras.callbacks.ModelCheckpoint
回调函数保存模型。
TF 版本:2.0.0a
编辑:同样的问题也与 2.0.0-beta1
我保存pb的步骤:
- 我先设置
K.set_learning_phase(0)
- 然后我用
tf.keras.models.load_model
加载模型
- 然后,我定义
freeze_session()
函数。
- (可选我编译模型)
- 然后使用
freeze_session()
函数和 tf.keras.backend.get_session
我得到的错误,有没有编译:
AttributeError: module 'tensorflow.python.keras.api._v2.keras.backend'
has no attribute 'get_session'
我的问题:
TF2没有get_session
了吗?
(我知道 tf.contrib.saved_model.save_keras_model
不存在了,我也试过 tf.saved_model.save
但没有用)
或者 get_session
仅在我实际训练模型时才起作用,仅加载 h5 不起作用
编辑:还有新训练的课程,没有 get_session 可用。
- 如果是这样,我将如何在没有训练的情况下将 h5 转换为 pb?有没有好的教程?
感谢您的帮助
更新:
自从 TF2.x 正式发布以来,graph/session 概念发生了变化。应使用 savedmodel
api。
您可以将 tf.compat.v1.disable_eager_execution()
与 TF2.x 一起使用,这将生成一个 pb 文件。但是,我不确定它是什么类型的 pb 文件,因为保存的模型组成从 TF1 更改为 TF2。我会继续挖掘的。
我也在想同样的事情,因为我正在尝试使用 get_session() 和 set_session() 来释放 GPU 内存。这些功能似乎缺失 aren't in the TF2.0 Keras documentation。我想这与 Tensorflow 切换到急切执行有关,因为不再需要直接会话访问。
我确实将模型从 h5
模型保存到 pb
模型:
import logging
import tensorflow as tf
from tensorflow.compat.v1 import graph_util
from tensorflow.python.keras import backend as K
from tensorflow import keras
# necessary !!!
tf.compat.v1.disable_eager_execution()
h5_path = '/path/to/model.h5'
model = keras.models.load_model(h5_path)
model.summary()
# save pb
with K.get_session() as sess:
output_names = [out.op.name for out in model.outputs]
input_graph_def = sess.graph.as_graph_def()
for node in input_graph_def.node:
node.device = ""
graph = graph_util.remove_training_nodes(input_graph_def)
graph_frozen = graph_util.convert_variables_to_constants(sess, graph, output_names)
tf.io.write_graph(graph_frozen, '/path/to/pb/model.pb', as_text=False)
logging.info("save pb successfully!")
我使用 TF2 转换模型如下:
- 将
keras.callbacks.ModelCheckpoint(save_weights_only=True)
传递给model.fit
并在训练时保存checkpoint
;
- 训练后,
self.model.load_weights(self.checkpoint_path)
加载checkpoint
;
self.model.save(h5_path, overwrite=True, include_optimizer=False)
另存为h5
;
- 像上面一样将
h5
转换为pb
;
使用
from tensorflow.compat.v1.keras.backend import get_session
在 keras 2 和 tensorflow 2.2 中
然后打电话
import logging
import tensorflow as tf
from tensorflow.compat.v1 import graph_util
from tensorflow.python.keras import backend as K
from tensorflow import keras
from tensorflow.compat.v1.keras.backend import get_session
# necessary !!!
tf.compat.v1.disable_eager_execution()
h5_path = '/path/to/model.h5'
model = keras.models.load_model(h5_path)
model.summary()
# save pb
with get_session() as sess:
output_names = [out.op.name for out in model.outputs]
input_graph_def = sess.graph.as_graph_def()
for node in input_graph_def.node:
node.device = ""
graph = graph_util.remove_training_nodes(input_graph_def)
graph_frozen = graph_util.convert_variables_to_constants(sess, graph, output_names)
tf.io.write_graph(graph_frozen, '/path/to/pb/model.pb', as_text=False)
logging.info("save pb successfully!")
我加载了一个已保存的 h5 模型并想将模型保存为 pb。
在训练期间使用 tf.keras.callbacks.ModelCheckpoint
回调函数保存模型。
TF 版本:2.0.0a
编辑:同样的问题也与 2.0.0-beta1
我保存pb的步骤:
- 我先设置
K.set_learning_phase(0)
- 然后我用
tf.keras.models.load_model
加载模型
- 然后,我定义
freeze_session()
函数。 - (可选我编译模型)
- 然后使用
freeze_session()
函数和tf.keras.backend.get_session
我得到的错误,有没有编译:
AttributeError: module 'tensorflow.python.keras.api._v2.keras.backend' has no attribute 'get_session'
我的问题:
TF2没有
get_session
了吗? (我知道tf.contrib.saved_model.save_keras_model
不存在了,我也试过tf.saved_model.save
但没有用)或者
get_session
仅在我实际训练模型时才起作用,仅加载 h5 不起作用 编辑:还有新训练的课程,没有 get_session 可用。- 如果是这样,我将如何在没有训练的情况下将 h5 转换为 pb?有没有好的教程?
感谢您的帮助
更新:
自从 TF2.x 正式发布以来,graph/session 概念发生了变化。应使用 savedmodel
api。
您可以将 tf.compat.v1.disable_eager_execution()
与 TF2.x 一起使用,这将生成一个 pb 文件。但是,我不确定它是什么类型的 pb 文件,因为保存的模型组成从 TF1 更改为 TF2。我会继续挖掘的。
我也在想同样的事情,因为我正在尝试使用 get_session() 和 set_session() 来释放 GPU 内存。这些功能似乎缺失 aren't in the TF2.0 Keras documentation。我想这与 Tensorflow 切换到急切执行有关,因为不再需要直接会话访问。
我确实将模型从 h5
模型保存到 pb
模型:
import logging
import tensorflow as tf
from tensorflow.compat.v1 import graph_util
from tensorflow.python.keras import backend as K
from tensorflow import keras
# necessary !!!
tf.compat.v1.disable_eager_execution()
h5_path = '/path/to/model.h5'
model = keras.models.load_model(h5_path)
model.summary()
# save pb
with K.get_session() as sess:
output_names = [out.op.name for out in model.outputs]
input_graph_def = sess.graph.as_graph_def()
for node in input_graph_def.node:
node.device = ""
graph = graph_util.remove_training_nodes(input_graph_def)
graph_frozen = graph_util.convert_variables_to_constants(sess, graph, output_names)
tf.io.write_graph(graph_frozen, '/path/to/pb/model.pb', as_text=False)
logging.info("save pb successfully!")
我使用 TF2 转换模型如下:
- 将
keras.callbacks.ModelCheckpoint(save_weights_only=True)
传递给model.fit
并在训练时保存checkpoint
; - 训练后,
self.model.load_weights(self.checkpoint_path)
加载checkpoint
; self.model.save(h5_path, overwrite=True, include_optimizer=False)
另存为h5
;- 像上面一样将
h5
转换为pb
;
使用
from tensorflow.compat.v1.keras.backend import get_session
在 keras 2 和 tensorflow 2.2 中
然后打电话
import logging
import tensorflow as tf
from tensorflow.compat.v1 import graph_util
from tensorflow.python.keras import backend as K
from tensorflow import keras
from tensorflow.compat.v1.keras.backend import get_session
# necessary !!!
tf.compat.v1.disable_eager_execution()
h5_path = '/path/to/model.h5'
model = keras.models.load_model(h5_path)
model.summary()
# save pb
with get_session() as sess:
output_names = [out.op.name for out in model.outputs]
input_graph_def = sess.graph.as_graph_def()
for node in input_graph_def.node:
node.device = ""
graph = graph_util.remove_training_nodes(input_graph_def)
graph_frozen = graph_util.convert_variables_to_constants(sess, graph, output_names)
tf.io.write_graph(graph_frozen, '/path/to/pb/model.pb', as_text=False)
logging.info("save pb successfully!")