Tensorflow有一些docs用于子类化(tf)Keras container
和Model
。
但是,尚不清楚将哪个用于“模块”或“块”(例如,总的来说是多层)。
由于从技术上讲是几个层,我认为子类Layer
会欺骗,而子类Layer
有用时,我不确定是否对这样做。
例如
Model
哪个适合使用?
答案 0 :(得分:1)
最初,无需使用Keras进行任何细分。除非您有特定的原因(不是建立,训练,预测),否则您不会为Keras子类化。
使用Sequential
(模型已经准备好,只需添加图层),或使用Model
(创建带有图层的图形并最终调用Model(inputs, outputs)
),都不需要子类化。
创建Sequential
或Model
的实例之后,您便拥有了一个完全定义的模型,可以在所有情况下使用。
该模型甚至可以用作其他模型的一部分,可以轻松访问其图层以获取中间输出并在图形中创建新分支。
因此,我完全看不出有任何Model
子类的原因,除非您正在使用需要此子句的其他框架(但我不这么认为)。对于PyTorch用户而言,这似乎是有些东西(因为这种模型构建对于PyTorch很典型,因此为Module
创建一个子类,并添加层和调用方法)。但是Pytorch在获得中间结果方面不像Keras那样容易。
使用Keras的主要优点正是这样:您可以轻松地从块和模型访问层,并从该点立即开始分支,而无需重建任何调用方法或在模型中添加任何额外的代码。因此,当您继承Model的子类时,您只是在击败Keras的目的,这使它变得更加困难。
您提到的文档说:
启用子类时,模型子类特别有用,因为可以强制性地编写前向遍历。
我真的不明白“必须”是什么意思,而且我不明白这比仅创建具有常规图层的模型会更容易。
文档中的另一句话:
关键点:为作业使用正确的API。尽管模型子类化提供了灵活性,但它付出了更大的复杂性并增加了用户出错的机会。 如果可能,请使用功能性API。
嗯...这总是有可能的。
在这里,可能有充分的理由这样做。这些原因是:
如果您不需要上面的“两项”,则无需为图层子类化。如果您只想不带权重的“自定义计算”,那么Lambda
层就足够了。