【问题标题】:TF Keras v 1.14+: subclass model or subclass layer for "module"TF Keras v 1.14+:“模块”的子类模型或子类层
【发布时间】:2019-08-23 13:11:12
【问题描述】:

Tensorflow 有一些 docs 用于子类化 (tf) Keras ModelLayer

但是,对于“模块”或“块”(例如多个层的总称),尚不清楚。

由于它在技术上是几个层,我觉得子类化 Layer 会欺骗,虽然子类化 Model 有效,但我不确定这样做是否有任何负面惩罚。

例如

x = inputs
a = self.dense_1(x) # <--- self.dense_1 = tf.keras.Dense(...)
b = self.dense_2(a)
c = self.add([x, b])

哪个好用?

【问题讨论】:

    标签: python tensorflow tf.keras


    【解决方案1】:

    (请注意这个答案是旧的,后来,Keras 更改为允许并定期使用子类化)

    最初,没有必要使用 Keras 对任何东西进行子类化。除非您有特定的原因(不是构建、训练、预测),否则您不会为 Keras 子类化。

    构建 Keras 模型:

    无论是使用Sequential(模型已经准备好,只需添加层),还是使用Model(创建一个带有层的图,最后调用Model(inputs, outputs)),都不需要子类化。

    创建SequentialModel 实例的那一刻,您就拥有了一个完全定义的模型,可以在所有情况下使用。

    这个模型甚至可以用作其他模型的一部分,它的层可以很容易地访问以获得中间输出并在你的图中创建新的分支。

    所以,我完全看不出有任何理由将Model 子类化,除非您正在使用一些需要这样做的额外框架(但我不这么认为)。这似乎是来自 PyTorch 用户的东西(因为这种模型构建对于 PyTorch 来说是典型的,为Module 创建一个子类并添加层和一个调用方法)。但是 Pytorch 无法像 Keras 那样轻松获得中间结果。

    使用 Keras 的主要优点正是如此:您可以轻松地从块和模型中访问层,并立即从该点开始分支,而无需在模型中重新构建任何调用方法或为此添加任何额外代码。因此,当您将 Model 子类化时,您只是违背了 Keras 让这一切变得更加困难的目的。

    你提到的文档说:

    当启用急切执行时,模型子类化特别有用,因为可以强制编写前向传递。

    我真的不明白“势在必行”是什么意思,而且我不明白这比仅使用常规层构建模型更容易。

    文档中的另一个引用:

    关键点:为工作使用正确的 API。虽然模型子类化提供了灵活性,但它的代价是更大的复杂性和更多的用户错误机会。 如果可能,首选函数式 API。

    嗯...总是有可能的。

    子类化层

    在这里,这样做可能有充分的理由。这些原因是:

    • 您需要一个执行自定义计算的图层,而这是常规图层所不具备的
    • 此层必须具有持久权重。

    如果您不需要上面的“两者”,则不需要子类化层。如果您只想要没有权重的“自定义计算”,Lambda 层就足够了。

    【讨论】:

    • 感谢您深思熟虑的回复。事实上,我通常使用功能 API。我上面的例子是一个非序列模型(一个基本的残差结构),让这样的残差块可重用/可配置可能比在模型子类中声明所有层更可取。所以我才问。我想,我也可以将用于制作这些块的功能 api 与配置它们的子类模型混合在一起......
    • 总结得很好! (+1)
    • @SumNeuron,你当然可以混合使用这两种方法,没问题。但您也可以拥有def createResidualBlock(params): ... return Model(...,...)。功能齐全的 API。这两个想法最终都完美地发挥了作用。您可以使用您觉得更舒服的那个。
    • @DanielMöller 我想我被文档困住了,建议将模型的 每一层 设为self 的属性,并通过功能 api 制作某种“块”进入自定义模型会丢失...
    • 您可以在Modelmodel.layers[i]model.get_layer(name) 中按索引或名称获取图层。是的,也许将层作为属性可以使以后的代码更容易。
    猜你喜欢
    • 2021-03-11
    • 2019-08-30
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2019-12-10
    • 2017-11-08
    相关资源
    最近更新 更多