代码之家  ›  专栏  ›  技术社区  ›  daniel451

Keras模型的张量流图?

  •  2
  • daniel451  · 技术社区  · 6 年前

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


    我的目的只是把这两个世界的精华结合起来。

    我真的很喜欢用于原型和新实验的Keras模型API,即使用Awesome multi_gpu_model(model, gpus=4) 对于具有多个GPU的训练,保存/加载权重 整个模型都有一个内衬,所有的便利功能都像 .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 .

    DR:

    长话短说:我喜欢直接访问tf中的所有内容,但大多数情况下,一个简单的keras模型足以进行培训、推理……后来。在Keras中,API模型更加简单和方便。

    因此,我更愿意在本地tf中建立一个图表,并将其转换为keras进行培训、评估等。有什么办法吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Dmytro Prylipko    6 年前

    我认为不可能为任何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 :您提出了三个层:输入层、模型层和输出层。

    角膜保护剂

    然而,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中的样子: Tensorboard

    所以,Keras实际上只是TensorFlow的简化前端,所以您可以非常灵活地混合它们。我建议您检查 Keras model zoo 对于聪明的解决方案和模式,允许您使用清洁的Keras API构建复杂的模型。

        2
  •  3
  •   Jeffrey Ede    6 年前

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

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