【问题标题】:TensorFlow Graph to Keras Model?TensorFlow Graph 到 Keras 模型?
【发布时间】:2019-06-04 22:34:44
【问题描述】:

是否可以在原生 TensorFlow 中定义一个图,然后将该图转换为 Keras 模型?


我的意图只是结合(对我而言)这两个世界中最好的。

我真的很喜欢用于原型设计和新实验的 Keras 模型 API,即使用很棒的 multi_gpu_model(model, gpus=4) 进行多 GPU 训练、保存/加载权重带有 oneliners 的整个模型、所有便利功能比如.fit().predict()等等。

但是,我更喜欢在原生 TensorFlow 中定义我的模型。 TF 中的上下文管理器非常棒,在我看来,用它们实现 GAN 之类的东西要容易得多:

with tf.variable_scope("Generator"):
    # define some layers
with tf.variable_scope("Discriminator"):
    # define some layers

# model losses
G_train_op = ...AdamOptimizer(...)
    .minimize(gloss,
    var_list=tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, 
                               scope="Generator")
D_train_op = ...AdamOptimizer(...)
    .minimize(dloss, 
    var_list=tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, 
                               scope="Discriminator")

另一个好处是用这种方式构建图表。在 TensorBoard 中调试复杂的原生 Keras 模型是地狱,因为它们根本没有结构化。通过在原生 TF 中大量使用变量范围,您可以“解开”图形并查看复杂模型的结构化版本以进行调试。

通过利用它,我可以直接设置自定义损失函数,并且不必在每次训练迭代中冻结任何东西,因为 TF 只会更新正确范围内的权重,这(至少在我看来)比 Keras 容易得多循环遍历所有现有层并设置.trainable = False的解决方案。

TL;DR:

长话短说:我喜欢直接访问 TF 中的所有内容,但大多数时候,一个简单的 Keras 模型就足以用于训练、推理……以后。模型 API 在 Keras 中更加简单方便。

因此,我更愿意在原生 TF 中建立一个图,并将其转换为 Keras 进行训练、评估等。有没有办法做到这一点?

【问题讨论】:

标签: tensorflow keras deep-learning


【解决方案1】:

我认为不可能为任何 TF 图创建一个通用的自动转换器,它会产生一组有意义的层,具有正确的命名等。仅仅因为图比一系列 Keras 层更灵活.

但是,您可以使用 Lambda layer 包装您的模型。在一个函数中构建你的模型,用 Lambda 包装它,然后你就可以在 Keras 中使用它了:

def model_fn(x):
    layer_1 = tf.layers.dense(x, 100)
    layer_2 = tf.layers.dense(layer_1, 100)
    out_layer = tf.layers.dense(layer_2, num_classes)
    return out_layer

model.add(Lambda(model_fn))

这就是您使用multi_gpu_model 时有时会发生的情况:您提出了三层:输入、模型和输出。

Keras 道歉

但是,TensorFlow 和 Keras 之间的集成可以更加紧密和有意义。有关用例,请参阅 this tutorial

例如,可以像在 TensorFlow 中一样使用变量范围:

x = tf.placeholder(tf.float32, shape=(None, 20, 64))
with tf.name_scope('block1'):
    y = LSTM(32, name='mylstm')(x)

手动放置设备也是如此:

with tf.device('/gpu:0'):
    x = tf.placeholder(tf.float32, shape=(None, 20, 64))
    y = LSTM(32)(x)  # all ops / variables in the LSTM layer will live on GPU:0

此处讨论自定义损失:Keras: clean implementation for multiple outputs and custom loss functions?

这是我在 Keras 中定义的模型在 Tensorboard 中的外观:

因此,Keras 确实只是 TensorFlow 的简化前端,因此您可以非常灵活地混合它们。我建议您检查 Keras model zoo 的源代码,以了解允许您使用 Keras 的干净 API 构建复杂模型的巧妙解决方案和模式。

【讨论】:

【解决方案2】:

您可以将 TensorFlow 代码直接插入到您的 Keras 模型或训练管道中! 自 2017 年年中以来,Keras 已全面采用并集成到 TensorFlow 中。 This article 更详细。

这意味着您的 TensorFlow 模型已经是 Keras 模型,反之亦然。您可以在 Keras 中开发并在需要时切换到 TensorFlow。 TensorFlow 代码将与 Keras API 一起使用,包括用于训练、推理和保存模型的 Keras API。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 2017-12-17
    • 2021-12-26
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多