У меня есть модель Keras, которую я бы хотел преобразовать в protobuf Tensorflow (например, saved_model.pb
).
Эта модель исходит из передачи обучения в сети vgg-19, в которой и головка была отключена и обучена с полностью подключенными + softmax слоями, а остальная часть сети vgg-19 была заморожена.
Я могу загрузить модель в Keras, а затем использовать keras.backend.get_session()
для запуска модели в тензорном потоке, генерируя правильные прогнозы:
frame = preprocess(cv2.imread("path/to/img.jpg")
keras_model = keras.models.load_model("path/to/keras/model.h5")
keras_prediction = keras_model.predict(frame)
print(keras_prediction)
with keras.backend.get_session() as sess:
tvars = tf.trainable_variables()
output = sess.graph.get_tensor_by_name('Softmax:0')
input_tensor = sess.graph.get_tensor_by_name('input_1:0')
tf_prediction = sess.run(output, {input_tensor: frame})
print(tf_prediction) # this matches keras_prediction exactly
Если я не включаю строку tvars = tf.trainable_variables()
, то переменная tf_prediction
полностью ошибочна и вообще не соответствует выводу из keras_prediction
. Фактически все значения в выходе (одиночный массив с 4 значениями вероятности) одинаковы (~ 0.25, все добавляются к 1). Это заставило меня подозревать, что веса для головы только инициализируются до 0, если tf.trainable_variables()
не вызывается первым, что было подтверждено после проверки переменных модели. В любом случае вызов tf.trainable_variables()
приводит к правильному прогнозированию тензорного потока.
Проблема в том, что когда я пытаюсь сохранить эту модель, переменные из tf.trainable_variables()
фактически не сохраняются в файле .pb
:
with keras.backend.get_session() as sess:
tvars = tf.trainable_variables()
constant_graph = graph_util.convert_variables_to_constants(sess, sess.graph.as_graph_def(), ['Softmax'])
graph_io.write_graph(constant_graph, './', 'saved_model.pb', as_text=False)
Я спрашиваю, как я могу сохранить модель Keras в качестве протобуфа Tensorflow с tf.training_variables()
неповрежденным?
Большое спасибо!