定义自定义 tf.keras 层时是否仍然需要实现 `compute_output_shape()`?

Is it still necessary to implement `compute_output_shape()` when defining a custom tf.keras Layer?

我使用 TensorFlow 2.1.0 在 tf.keras 中实现了自定义 Layer

以前使用单机Keras时,重要的是在任意自定义层中定义compute_output_shape(input_shape)方法,这样才能创建计算图。

现在,转移到 TF2 后,我发现即使我从我的自定义实现中删除该方法,该层仍按预期工作。显然,它在 eager 和 graph 模式下都可以工作。 这是我的意思的一个例子:

from tensorflow.keras.layers import Layer, Input
from tensorflow.keras.models import Sequential
import numpy as np


class MyLayer(Layer):
    def call(self, inputs):
        return inputs[:, :-1]  # Do something that changes the shape


m = Sequential([MyLayer(), MyLayer()])
m.predict(np.ones((10, 3)))  # This would not have worked in the past

可以说 compute_output_shape() 不再是必需的了吗?我错过了什么重要的东西吗?

文档中没有明确提及删除 compute_output_shape(),尽管 none 示例明确实现了它。

谢谢

Tensorflow 文档中未提及,但在本书的第 12 章Custom Models and Training with TensorFlow 中,O'REILLY Publications 的 Hands-on Machine Learning using Scikit-Learn and Tensorflow (2nd Edition Updated for Tensorflow 2),由 Aurelien Geron 撰写,如下面的截图所示:

回答你的问题,是的,可以肯定地说 compute_output_shape 是不需要的,除非图层是动态的。

Tensorflow Tutorial on Custom Layer 可以明显看出 compute_output_shape 没有被使用。

希望这对您有所帮助。快乐学习!