如何将训练有素的Tensorflow模型转换为Keras?

时间:2017-06-09 20:16:05

标签: tensorflow keras

我有一个训练有素的Tensorflow模型和权重向量,它们分别导出到protobuf和权重文件。

如何将这些转换为可供Keras使用的JSON或YAML和HDF5文件?

我有Tensorflow模型的代码,因此将tf.Session转换为keras模型并将其保存在代码中也是可以接受的。

4 个答案:

答案 0 :(得分:10)

我认为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])

那没关系。 我认为它很容易实现并希望它有所帮助。

答案 1 :(得分:8)

目前,Tensorflow或Keras中没有直接内置支持将冻结模型或检查点文件转换为hdf5格式。

但是既然你已经提到你有Tensorflow模型的代码,你将不得不在Keras中重写该模型的代码。然后,您必须从检查点文件中读取变量的值,并使用layer.load_weights(weights)方法将其分配给Keras模型。

除了这种方法之外,我建议您直接在Keras进行培训,因为它声称Keras' optimizers are 5-10% times faster than Tensorflow's optimizers。其他方法是使用tf.contrib.keras模块在​​Tensorflow中编写代码,并以hdf5格式直接保存文件。

答案 2 :(得分:6)

keras的创建者Francois Chollet在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))

导出tensorflow模型以在tensorboard中使用也可能有用,请参阅https://stackoverflow.com/a/43569991/2135504

第二,您通常按照自己的方式构建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']])

答案 3 :(得分:2)

不确定这是否是您正在寻找的,但我碰巧对TF 1.2中新发布的keras支持做了同样的事情。您可以在此处找到有关API的更多信息:https://www.tensorflow.org/api_docs/python/tf/contrib/keras

为了节省您一点时间,我还发现我必须包含如下所示的keras模块,并在API文档中显示附加的python.keras。

  

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

希望有助于您到达目的地。基本上一旦集成,您就可以像往常一样处理模型/重量输出。