将 onnx 模型导入 tensorflow2.x?

Import onnx models to tensorflow2.x?

我使用 tensorflow 创建了一个修改过的 lenet 模型,如下所示:

img_height = img_width = 64
BS = 32

model = models.Sequential()
model.add(layers.InputLayer((img_height,img_width,1), batch_size=BS))
model.add(layers.Conv2D(filters=32, kernel_size=(3, 3), strides=(1, 1), batch_size=BS, activation='relu', padding="valid"))
model.add(layers.Conv2D(filters=64, kernel_size=(3, 3), strides=(1, 1), batch_size=BS, activation='relu', padding='valid'))
model.add(layers.MaxPooling2D(pool_size=(2, 2), strides=(2, 2), batch_size=BS, padding='valid'))
model.add(layers.Dropout(0.25))
model.add(layers.Conv2D(filters=128, kernel_size=(1,1), strides=(1,1), batch_size=BS, activation='relu', padding='valid'))
model.add(layers.Dropout(0.5))
model.add(layers.Conv2D(filters=2, kernel_size=(1,1), strides=(1,1), batch_size=BS, activation='relu', padding='valid'))
model.add(layers.GlobalAveragePooling2D())
model.add(layers.Activation('softmax'))
model.summary()

当我完成训练后,我使用 tf.keras.models.save_model 保存模型:

num = time.time()
tf.keras.models.save_model(model,'./saved_models/' + str(num) + '/')

然后我使用“tf2onnx”模块将此模型转换为 onnx 格式:

! python -m tf2onnx.convert --saved-model saved_models/1645088924.84102/ --output 1645088924.84102.onnx

我想要一种可以将相同模型检索到 tensorflow2.x 的方法。我尝试使用“onnx_tf”将 onnx 模型转换为 tensorflow .pb 模型:

import onnx

from onnx_tf.backend import prepare

onnx_model = onnx.load("1645088924.84102.onnx")  # load onnx model
tf_rep = prepare(onnx_model)  # prepare tf representation

但此方法只生成.pb文件,但tensorflow2.x中的load_model方法需要在与.pb文件相同的目录中添加两个名为“variables”的文件夹和“资产”。

如果有办法使 .pb 文件像具有“资产”和“变量”文件夹一样工作,或者如果有可以从 onnx 生成完整模型的方法,我们将不胜感激.

我正在使用 jupyter hub 服务器,一切都在 anaconda 环境中。

事实证明,最简单的方法是 Tensorflow 支持人员在对原始 post 的评论中建议的方法,即将 .pb 文件转换回 .h5,然后重新使用模型。对于推理,我们可以使用 graph_def 和 concrete_function.

将 .pb 转换为 .h5:How to convert .pb file to .h5. (Tensorflow model to keras)

推理:https://leimao.github.io/blog/Save-Load-Inference-From-TF2-Frozen-Graph/