在我理解的这段代码中,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")
请任何一个澄清或提供任何充分的来源,以了解它
1条答案
按热度按时间7eumitmz1#
请看下面的链接:https://www.tensorflow.org/api_docs/python/tf/keras/layers/Layer#call
由init设置的模型初始状态和其他层的规范可以通过call()方法设置,该方法可以在示例和子类中使用。
在init中,您可以指定层及其属性,例如层的激活函数和每层中的节点数(单位参数)。然后在call()方法中指定层的流,这意味着哪个层的输出应该是哪个层的输入。正如你在下面的代码行中看到的:
还可以在call()中指定输出。输入定义输入层的形状。例如,如果您使用图像作为输入,并且您有20个RGB(3个通道)中30x30像素的图像,则输入数据的形状为(20,30,30,3),并且您的输入层Tensor可以如下定义:
当然,上面的不是你的输入形状,就像你在call()方法中一样:
input_wide, input_deep = inputs