【发布时间】:2022-01-13 09:37:28
【问题描述】:
我写了一个层,它什么都不做
class Fractal2D(tf.keras.layers.Layer):
def __init__(self, kernel_size_range):
super(Fractal2D, self).__init__()
self.kernel_size_range = kernel_size_range
def build(self, inputs):
print(f'build executes eagerly: {tf.executing_eagerly()}')
return inputs
def call(self, inputs):
print(f'call executes eagerly: {tf.executing_eagerly()}')
return inputs
做了一个模型
model = tf.keras.Sequential([
tf.keras.layers.InputLayer(input_shape=(224, 224, 3), batch_size=32),
Fractal2D(kernel_size_range=(3, 41)),
hub.KerasLayer("https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4", output_shape=[1280],
trainable=False),
tf.keras.layers.Dense(DIAGNOSIS_NUMBER, activation='softmax')
])
单元格的输出是
build executes eagerly: True
call executes eagerly: False
当我训练模型时
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(training_set, validation_data=validation_set, epochs=20)
我明白了
Epoch 1/20
call executes eagerly: False
call executes eagerly: False
问题:
- 为什么要在模型实例化时执行 build 和 call 方法?
- 如果急切执行是默认执行方法,为什么不急切执行调用方法?
【问题讨论】:
标签: python tensorflow machine-learning keras deep-learning