Позвольте мне объяснить мою установку. Я использую TensorFlow 2.1, версию Keras, поставляемую с TF, и вероятность TensorFlow 0,9.
У меня есть функция get_model
, которая создает (с помощью функционального API) и возвращает модель с использованием Keras и пользовательских слоев. В методе __init__
этих пользовательских слоев A
я вызываю метод A.m
, который выполняет оператор print(tf.executing_eagerly())
, но возвращает False
. Почему?
Если быть точнее, это примерно моя установка
def get_model():
inp = Input(...)
x = A(...)(inp)
x = A(...)(x)
...
model = Model(inp, out)
model.compile(...)
return model
class A(tfp.layers.DenseFlipout): # TensorFlow Probability
def __init__(...):
self.m()
def m(self):
print(tf.executing_eagerly()) # Prints False
В документации tf.executing_eagerly
говорится
Стремительное выполнение включено по умолчанию, и этот API возвращает True в большинстве случаев. Однако этот API может возвращать значение False в следующих случаях использования.
- Выполнение внутри
tf.function
, если ранее не вызывалось подtf.init_scope
илиtf.config.experimental_run_functions_eagerly(True)
.- Выполнение внутри функции преобразования для
tf.dataset
.tf.compat.v1.disable_eager_execution()
называется.
Но это не мой случай, поэтому tf.executing_eagerly()
в моем случае должно вернуть True
, но нет. Почему?
Вот простой полный пример (в TF 2.1), иллюстрирующий проблему.
import tensorflow as tf
class MyLayer(tf.keras.layers.Layer):
def call(self, inputs):
tf.print("tf.executing_eagerly() =", tf.executing_eagerly())
return inputs
def get_model():
inp = tf.keras.layers.Input(shape=(1,))
out = MyLayer(8)(inp)
model = tf.keras.Model(inputs=inp, outputs=out)
model.summary()
return model
def train():
model = get_model()
model.compile(optimizer="adam", loss="mae")
x_train = [2, 3, 4, 1, 2, 6]
y_train = [1, 0, 1, 0, 1, 1]
model.fit(x_train, y_train)
if __name__ == '__main__':
train()
В этом примере печатается tf.executing_eagerly() = False
.