TF Keras v1.14+:“模块”的子类模型或子类层

2024-05-19 18:42:20 发布

您现在位置:Python中文网/ 问答频道 /正文

Tensorflow有一些docs用于子类化(tf)KerasModel和{}。在

然而,对于“模块”或“块”使用哪一个还不清楚(例如,多个层合而为一)。在

由于它在技术上是几个层,我觉得子类化Layer是有欺骗性的,虽然子类化{}起作用,但我不确定这样做是否有任何负面影响。在

例如

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

哪个适合使用?在


Tags: 模块selfaddlayerdocstftensorflowkeras
1条回答
网友
1楼 · 发布于 2024-05-19 18:42:20

一开始,没有必要用Keras对任何东西进行二次分类。除非您有特定的原因(不是构建、培训、预测),否则您不会为Keras生成子类。在

建立Keras模型:

使用Sequential(模型已经准备好了,只需添加层),或者使用Model(创建一个带有层的图,最后调用Model(inputs, outputs)),您不需要子类化。在

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

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

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

使用Keras的主要优点正是:您可以轻松地从块和模型访问层,并立即从这一点开始分支,而无需重新构建任何调用方法或在模型中为此添加任何额外的代码。所以,当你对模型进行子类化的时候,你只是辜负了Keras的目的,使之更加困难。在

你提到的文件说:

Model subclassing is particularly useful when eager execution is enabled since the forward pass can be written imperatively.

我真的不明白“强制”是什么意思,我也不认为这比仅仅构建一个具有规则层的模型要容易得多。在

另一段引述:

Key Point: Use the right API for the job. While model subclassing offers flexibility, it comes at a cost of greater complexity and more opportunities for user errors. If possible, prefer the functional API.

嗯。。。总是有可能的。在

子类化层

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

  • 您需要一个执行常规图层无法使用的自定义计算的图层
  • 此层必须具有持久权重。在

如果你不需要“两个”以上的东西,你不需要子类化一个层。如果您只希望“自定义计算”不带权重,Lambda层就足够了。在

相关问题 更多 >