Есть ли способ импортировать модели 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/