Как преобразовать обученную модель 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']])