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

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

如何将它们转换为Keras可以使用的JSON或YAML和HDF5文件?

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

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

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']])
收藏
评论

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

为了节省您一些时间,我还发现我必须包括如下所示的keras模块,并将附加的python.keras附加到API文档中所显示的内容之后。

从tensorflow.contrib.keras.python.keras.models导入顺序

希望能帮助您到达想要去的地方。本质上,一旦集成,您就可以照常处理模型/重量导出。

收藏
评论

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

那就好我认为这很容易实现,希望对您有所帮助。

收藏
评论

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

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

除了这种方法论之外,我建议您直接在Keras中进行培训,因为它声称Keras的优化器比Tensorflow的优化器快5-10% 。其他方法是使用tf.contrib.keras模块在Tensorflow中编写代码,然后将文件直接保存为hdf5格式。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号