Как преобразовать обученную модель Tensorflow в Keras?

У меня есть подготовленная модель Tensorflow и вектор весов, которые были экспортированы соответственно в файлы protobuf и weight.

Как я могу преобразовать их в файлы JSON или YAML и HDF5, которые могут использоваться Keras?

У меня есть код для модели Tensorflow, поэтому было бы приемлемо преобразовать модель tf.Session в keras и сохранить ее в коде.

Ответ 1

В настоящее время нет прямой встроенной поддержки в Tensorflow или Keras для преобразования замороженной модели или файла контрольной точки в формат hdf5.

Но поскольку вы упомянули, что у вас есть код модели Tensorflow, вам придется переписать этот код модели в Keras. Затем вам нужно будет прочитать значения ваших переменных из файла контрольной точки и назначить ее модели layer.load_weights(weights) используя layer.load_weights(weights).

Больше, чем эта методология, я предлагаю вам сделать обучение непосредственно в Keras, поскольку он утверждал, что оптимизаторы Keras в 5-10% раз быстрее, чем оптимизаторы Tensorflow. Другой способ - написать свой код в Tensorflow с помощью модуля tf.contrib.keras и сохранить файл непосредственно в формате hdf5.

Ответ 2

Я думаю, что обратный вызов в keras также является решением.

Файл ckpt можно сохранить TF с помощью:

saver = tf.train.Saver()
saver.save(sess, checkpoint_name)

и для загрузки контрольной точки в Keras вам потребуется класс обратного вызова:

class RestoreCkptCallback(keras.callbacks.Callback):
    def __init__(self, pretrained_file):
        self.pretrained_file = pretrained_file
        self.sess = keras.backend.get_session()
        self.saver = tf.train.Saver()
    def on_train_begin(self, logs=None):
        if self.pretrian_model_path:
            self.saver.restore(self.sess, self.pretrian_model_path)
            print('load weights: OK.')

Затем в вашем скрипте keras:

 model.compile(loss='categorical_crossentropy', optimizer='rmsprop')
 restore_ckpt_callback = RestoreCkptCallback(pretrian_model_path='./XXXX.ckpt') 
 model.fit(x_train, y_train, batch_size=128, epochs=20, callbacks=[restore_ckpt_callback])

Это будет здорово. Я думаю, что это легко реализовать и надеюсь, что это поможет.

Ответ 3

Не уверен, что это то, что вы ищете, но мне просто удалось сделать то же самое с недавно выпущенной поддержкой keras в TF 1.2. Дополнительную информацию о API вы можете найти здесь: https://www.tensorflow.org/api_docs/python/tf/contrib/keras

Чтобы сэкономить вам немного времени, я также обнаружил, что мне нужно включить модули keras, как показано ниже, с дополнительными python.keras, добавленными к тому, что показано в документах API.

from tensorflow.contrib.keras.python.keras.models import Sequential

Надеюсь, что поможет вам, куда вы хотите отправиться. По сути, когда-то интегрированный, вы тогда просто обрабатываете экспорт модели/веса, как обычно.

Ответ 4

Франсуа Шоле, создатель keras, заявил в 04/2017, что "вы не можете превратить произвольную контрольную точку TensorFlow в модель Keras. Однако вы можете создать эквивалентную модель Keras, а затем загрузить в нее веса Keras", см. https://github.com/keras-team/keras/issues/5273. Насколько мне известно, это не изменилось.

Небольшой пример:

Во-первых, вы можете извлечь вес контрольной точки тензорного потока, как это

PATH_REL_META = r'checkpoint1.meta'

# start tensorflow session
with tf.Session() as sess:

    # import graph
    saver = tf.train.import_meta_graph(PATH_REL_META)

    # load weights for graph
    saver.restore(sess, PATH_REL_META[:-5])

    # get all global variables (including model variables)
    vars_global = tf.global_variables()

    # get their name and value and put them into dictionary
    sess.as_default()
    model_vars = {}
    for var in vars_global:
        try:
            model_vars[var.name] = var.eval()
        except:
            print("For var={}, an exception occurred".format(var.name))

Это также может быть полезно для экспорта модели тензорного потока для использования в тензорной доске, см. fooobar.com/info/624482/...

Во-вторых, вы строите свою модель keras как обычно и завершаете ее с помощью "model.compile". Обратите внимание, что вам нужно дать вам определить каждый слой по имени и добавить его в модель после этого, например,

layer_1 = keras.layers.Conv2D(6, (7,7), activation='relu', input_shape=(48,48,1))
net.add(layer_1)
...
net.compile(...)

В-третьих, вы можете установить веса с помощью значений тензорного потока, например

layer_1.set_weights([model_vars['conv7x7x1_1/kernel:0'], model_vars['conv7x7x1_1/bias:0']])