首页 文章

如何将经过训练的Tensorflow模型转换为Keras?

提问于
浏览
14

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

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

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

4 回答

  • 6

    目前,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

    我认为keras的回调也是一种解决方案 .

    TF可以保存ckpt文件:

    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])
    

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

  • 7

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

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

    来自tensorflow.contrib.keras.python.keras.models import Sequential

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

  • 2

    keras的创建者Francois Chollet在04/2017 "you cannot turn an arbitrary TensorFlow checkpoint into a Keras model. What you can do, however, is build an equivalent Keras model then load into this Keras model the weights"中说,见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))
    

    导出张量流模型以用于张量板也可能有用,参见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(...)
    

    第三,您可以使用tensorflow值设置权重,例如

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

相关问题