У меня есть модель, хранящаяся в формате hdf5, которую я экспортирую в файл protobuf (PB) с помощью save_model.save, например:
from tensorflow import keras
import tensorflow as tf
model = keras.models.load_model("model.hdf5")
tf.saved_model.save(model, './output_dir/')
это работает нормально, и в результате получается файл save_model.pb который я могу позже просмотреть с другим программным обеспечением без проблем.
Однако, когда я пытаюсь импортировать этот файл PB, используя TensorFlow1, мой код завершается ошибкой. Так как PB должен быть универсальным форматом, это меня смущает.
Код, который я использую для чтения файла PB, таков:
import tensorflow as tf
curr_graph = tf.Graph()
curr_sess = tf.InteractiveSession(graph=curr_graph)
f = tf.gfile.GFile('model.hdf5','rb')
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
f.close()
Это исключение, которое я получаю:
Трассировка (последний вызов был последним): файл "read_pb.py", строка 14, в graph_def.ParseFromString (f.read ()) google.protobuf.message.DecodeError: Ошибка при синтаксическом анализе сообщения
У меня есть другая модель, хранящаяся в виде файла PB, на котором код чтения работает нормально.
Что происходит?
***** РЕДАКТИРОВАТЬ 1 *****
При использовании приведенного ниже кода Андреа Анджели я столкнулся со следующей ошибкой:
Обнаружена ошибка: NodeDef упоминает attr 'exponential_avg_factor', который отсутствует в действии: T, batch_mean: U, batch_variance: U, reserve_space_1: U, Reserve_space_2: U, Reserve_space_3: U; attr = T: тип, допустимый = [DT_HALF, DT_BFLOAT16, DT_FLOAT]; атр = U: тип, разрешено = [DT_FLOAT]; атр = эпсилон: поплавок, по умолчанию = 0,0001; attr = data_format: string, default = "NHW C", позволено = ["NHW C", "NCHW"]; атр = is_training: BOOL, по умолчанию = истина>; NodeDef: {узел u-mobilenetv2 / bn_Conv1 / FusedBatchNormV3}. (Проверьте, соответствует ли ваш двоичный файл, интерпретирующий GraphDef, вашему двоичному файлу, генерирующему GraphDef.).
Есть ли обходной путь для этого?