python 在tensorflow Model类中,call方法是如何工作的?

avwztpqn  于 2023-06-28  发布在  Python
关注(0)|答案(1)|浏览(266)

在我理解的这段代码中,init用于定义层,在调用中我可以看到前馈是如何工作的。
1.我不明白这个调用方法是如何工作的
1.这是否等于dunder调用方法?
1.这是一个普通的方法吗?我们应该调用--> instance.call()吗?

class WideAndDeepModel(tf.keras.Model):
    def __init__(self, units=30, activation="relu", **kwargs):
        super().__init__(**kwargs)  # needed to support naming the model
        self.norm_layer_wide = tf.keras.layers.Normalization()
        self.norm_layer_deep = tf.keras.layers.Normalization()
        self.hidden1 = tf.keras.layers.Dense(units, activation=activation)
        self.hidden2 = tf.keras.layers.Dense(units, activation=activation)
        self.main_output = tf.keras.layers.Dense(1)
        self.aux_output = tf.keras.layers.Dense(1)

    def call(self, inputs):
        input_wide, input_deep = inputs
        norm_wide = self.norm_layer_wide(input_wide)
        norm_deep = self.norm_layer_deep(input_deep)
        hidden1 = self.hidden1(norm_deep)
        hidden2 = self.hidden2(hidden1)
        concat = tf.keras.layers.concatenate([norm_wide, hidden2])
        output = self.main_output(concat)
        aux_output = self.aux_output(hidden2)
        return output, aux_output

model = WideAndDeepModel(30, activation="relu", name="my_cool_model")

请任何一个澄清或提供任何充分的来源,以了解它

7eumitmz

7eumitmz1#

请看下面的链接:https://www.tensorflow.org/api_docs/python/tf/keras/layers/Layer#call
init设置的模型初始状态和其他层的规范可以通过call()方法设置,该方法可以在示例和子类中使用。
init中,您可以指定层及其属性,例如层的激活函数和每层中的节点数(单位参数)。然后在call()方法中指定层的流,这意味着哪个层的输出应该是哪个层的输入。正如你在下面的代码行中看到的:

hidden1 = self.hidden1(norm_deep)
hidden2 = self.hidden2(hidden1)
concat = tf.keras.layers.concatenate([norm_wide, hidden2])

还可以在call()中指定输出。输入定义输入层的形状。例如,如果您使用图像作为输入,并且您有20个RGB(3个通道)中30x30像素的图像,则输入数据的形状为(20,30,30,3),并且您的输入层Tensor可以如下定义:

inputs = tf.keras.Input(shape=(20,30,30,3))

当然,上面的不是你的输入形状,就像你在call()方法中一样:input_wide, input_deep = inputs

相关问题