TF Keras v 1.14+:“模块”的子类模型或子类层

时间:2019-08-23 13:11:12

标签: python tensorflow tf.keras

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

但是,尚不清楚将哪个用于“模块”或“块”(例如,总的来说是多层)。

由于从技术上讲是几个层,我认为子类Layer会欺骗,而子类Layer有用时,我不确定是否对这样做。

例如

Model

哪个适合使用?

1 个答案:

答案 0 :(得分:1)

最初,无需使用Keras进行任何细分。除非您有特定的原因(不是建立,训练,预测),否则您不会为Keras子类化。

建立Keras模型:

使用Sequential(模型已经准备好,只需添加图层),或使用Model(创建带有图层的图形并最终调用Model(inputs, outputs)),都不需要子类化。

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

该模型甚至可以用作其他模型的一部分,可以轻松访问其图层以获取中间输出并在图形中创建新分支。

因此,我完全看不出有任何Model子类的原因,除非您正在使用需要此子句的其他框架(但我不这么认为)。对于PyTorch用户而言,这似乎是有些东西(因为这种模型构建对于PyTorch很典型,因此为Module创建一个子类,并添加层和调用方法)。但是Pytorch在获得中间结果方面不像Keras那样容易。

使用Keras的主要优点正是这样:您可以轻松地从块和模型访问层,并从该点立即开始分支,而无需重建任何调用方法或在模型中添加任何额外的代码。因此,当您继承Model的子类时,您只是在击败Keras的目的,这使它变得更加困难。

您提到的文档说:

  

启用子类时,模型子类特别有用,因为可以强制性地编写前向遍历。

我真的不明白“必须”是什么意思,而且我不明白这比仅创建具有常规图层的模型会更容易。

文档中的另一句话:

  

关键点:为作业使用正确的API。尽管模型子类化提供了灵活性,但它付出了更大的复杂性并增加了用户出错的机会。 如果可能,请使用功能性API。

嗯...这总是有可能的。

子类化层

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

  • 您想要一个执行自定义计算的图层,而常规图层则不可用
  • 该层必须具有持久的权重。

如果您不需要上面的“两项”,则无需为图层子类化。如果您只想不带权重的“自定义计算”,那么Lambda层就足够了。