【问题标题】:why implementing the "call" method when subclassing a tf.keras layer(or model) class makes the layer(model) object callable?为什么在子类化 tf.keras 层(或模型)类时实现“调用”方法会使层(模型)对象可调用?
【发布时间】:2020-11-10 12:11:02
【问题描述】:

在编写自定义的 tf.keras 图层时,我们必须实现“call”方法,因为如果对象具有有效的“__call__”方法。虽然我没有找到类似的东西

class tf.keras.model():
def __call__(self, input):
    return self.call(input)

在 keras.model 源代码中,这一切如何运作?

【问题讨论】:

    标签: python keras tensorflow2.0


    【解决方案1】:
    from keras.models import Model
    import inspect
    
    inspect.getmro(Model)
    # (keras.engine.training.Model, keras.engine.network.Network, keras.engine.layer._Layer)
    

    inspect.getmro(CLS) 按方法​​解析顺序返回类 CLS 的基类(包括 CLS)的元组。

    Model 中的__call__ 方法实际上来自keras.engine.layer._Layer 类。可以参考代码here

    996 线上,__call__ 内部方法call_fn 被分配为call & 确实在979 线上调用。

    所以,在某种程度上,我猜,以下是正确的 -

    def __call__(self, input):
        return self.call(input)
    

    让我们进一步讨论!

    【讨论】:

    • 我太天真了,没有沿着类继承路径深入追踪,非常感谢您的帮助。
    • 如果你觉得答案对@WenjunFu 有用,你可以接受并点赞,以便其他人找到它
    猜你喜欢
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多