Есть ли способ импортировать модели onnx в tensorflow2.x?

Я создал модифицированную модель lenet с помощью tf.keras, которая выглядит так:

      img_height = 64
img_width  = 64
BS = 64

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) + '/')

Затем я преобразую эту модель в формат onnx с помощью модуля «tf2onnx»:

      ! 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, а для метода load_model в tensorflow2.x требуются две дополнительные папки в том же каталоге, что и файл .pb, которые называются «переменные» и «активы».

Если есть способ заставить файл .pb работать так, как будто он имеет папки «активы» и «переменные», или если есть метод, который может создать полную модель из onnx, любое решение будет оценено.

Я использую хаб-сервер jupyter, и все находится внутри среды anaconda.

1 ответ

Как оказалось, самый простой способ сделать это — это то, что предложила поддержка Tensorflow в комментарии к исходному сообщению, а именно преобразовать файл .pb обратно в .h5, а затем повторно использовать модель. Для логического вывода мы можем использовать graph_def и convert_function.

Преобразование .pb в .h5 : Как преобразовать файл .pb в .h5. (модель Tensorflow для keras)

Для вывода: https://leimao.github.io/blog/Save-Load-Inference-From-TF2-Frozen-Graph/

Другие вопросы по тегам