Пользовательский слой, который вы определили для вычисления потерь, т.е. CustomVariationalLayer
, обращается к тензорам модели, которые не были переданы ему напрямую. Это запрещено, так как активный режим включен, но функция в слое по умолчанию выполняется в графическом режиме. Чтобы решить эту проблему, вы можете либо полностью отключить активный режим, используя tf.compat.v1.disable_eager_execution()
, либо вместо этого использовать tf.config.run_functions_eagerly(True)
, чтобы все функции работали быстро.
Однако оба вышеперечисленных решения могут быть нежелательными, поскольку они изменение поведения TF по умолчанию (особенно последнего, поскольку это может снизить производительность). Поэтому вместо использования этих решений вы можете изменить определение CustomVariationalLayer
, чтобы принимать z_mean
и z_log_var
в качестве других входных данных:
class CustomVariationalLayer(keras.layers.Layer):
def vae_loss(self, x, z_decoded, z_mean, z_log_var):
# ...
def call(self, inputs):
x = inputs[0]
z_decoded = inputs[1]
z_mean = inputs[2]
z_log_var = inputs[3]
loss = self.vae_loss(x, z_decoded, z_mean, z_log_var)
# ...
y = CustomVariationalLayer()([input_img, z_decoded, z_mean, z_log_var])