Ответ 1
Итак, ваш подход замораживания переменных на графике (преобразование в константы) должен работать, но не нужен и сложнее других подходов. (подробнее об этом ниже). Если по какой-то причине вы хотите замораживать график (например, экспортировать на мобильное устройство), мне понадобится дополнительная информация, чтобы помочь отладить, поскольку я не уверен, что неявный материал Keras делает за кулисами с вашим графиком. Однако, если вы хотите просто сохранить и загрузить график позже, я могу объяснить, как это сделать (хотя никаких гарантий того, что все, что делает Keras, не будет испорчено..., рад помочь отладить это).
Таким образом, здесь есть два формата. Один из них - это GraphDef
, который используется для контрольной точки, поскольку он не содержит метаданных о входах и выходах. Другой - это MetaGraphDef
, который содержит метаданные и граф def, метаданные полезны для предсказания и запускают ModelServer
(из tensorflow/serve).
В любом случае вам нужно сделать больше, чем просто вызвать graph_io.write_graph
, потому что переменные обычно хранятся вне графика.
В обоих случаях используются библиотеки-обертки. tf.train.Saver
в основном используется для сохранения и восстановления контрольных точек.
Однако, поскольку вы хотите предсказание, я бы предложил использовать tf.saved_model.builder.SavedModelBuilder
для создания двоичного файла SavedModel. Я привел несколько табличек котлов для этого ниже:
from tensorflow.python.saved_model.signature_constants import DEFAULT_SERVING_SIGNATURE_DEF_KEY as DEFAULT_SIG_DEF
builder = tf.saved_model.builder.SavedModelBuilder('./mymodel')
with keras.backend.get_session() as sess:
output = sess.graph.get_tensor_by_name('Softmax:0')
input_tensor = sess.graph.get_tensor_by_name('input_1:0')
sig_def = tf.saved_model.signature_def_utils.predict_signature_def(
{'input': input_tensor},
{'output': output}
)
builder.add_meta_graph_and_variables(
sess, tf.saved_model.tag_constants.SERVING,
signature_def_map={
DEFAULT_SIG_DEF: sig_def
}
)
builder.save()
После запуска этого кода вы должны иметь файл mymodel/saved_model.pb
, а также каталог mymodel/variables/
с protobufs, соответствующими значениям переменных.
Затем, чтобы загрузить модель снова, просто используйте tf.saved_model.loader
:
# Does Keras give you the ability to start with a fresh graph?
# If not you'll need to do this in a separate program to avoid
# conflicts with the old default graph
with tf.Session(graph=tf.Graph()):
meta_graph_def = tf.saved_model.loader.load(
sess,
tf.saved_model.tag_constants.SERVING,
'./mymodel'
)
# From this point variables and graph structure are restored
sig_def = meta_graph_def.signature_def[DEFAULT_SIG_DEF]
print(sess.run(sig_def.outputs['output'], feed_dict={sig_def.inputs['input']: frame}))
Очевидно, что существует более эффективное предсказание, доступное с помощью этого кода через tenorflow/serve или Cloud ML Engine, но это должно работать. Возможно, что Keras делает что-то под капотом, что также будет мешать этому процессу, и если это так, мы хотели бы услышать об этом (и я хотел бы убедиться, что пользователи Keras также могут заморозить графики, поэтому, если вы хотите отправить мне свой код с полным кодом или что-то, может быть, я найду того, кто знает Keras, чтобы помочь мне отлаживать.)
EDIT: здесь вы можете найти пример конца: https://github.com/GoogleCloudPlatform/cloudml-samples/blob/master/census/keras/trainer/model.py#L85