Je reçois une erreur:
TypeError: An op outside of the function building code is being passed
a "Graph" tensor. It is possible to have Graph tensors
leak out of the function building context by including a
tf.init_scope in your function building code.
For example, the following function will fail:
@tf.function
def has_init_scope():
my_constant = tf.constant(1.)
with tf.init_scope():
added = my_constant * 2
Utilisation d'une couche NVP comme suit:
import tensorflow_probability as tfp
tfb = tfp.bijectors
tfd = tfp.distributions
class NVPLayer(tf.keras.models.Model):
def __init__(self, *, output_dim, num_masked, **kwargs):
super().__init__(**kwargs)
self.output_dim = output_dim
self.num_masked = num_masked
self.shift_and_log_scale_fn = tfb.real_nvp_default_template(
hidden_layers=[2], # HERE HERE ADJUST THIS
activation=None, # linear
)
self.loss = None
def get_nvp(self):
nvp = tfd.TransformedDistribution(
distribution=tfd.MultivariateNormalDiag(loc=[0.] * self.output_dim),
bijector=tfb.RealNVP(
num_masked=self.num_masked,
shift_and_log_scale_fn=self.shift_and_log_scale_fn)
)
return nvp
def call(self, *inputs):
nvp = self.get_nvp()
self.loss = tf.reduce_mean(nvp.log_prob(*inputs)) # how else to do this?
# return nvp.bijector.forward(*inputs)
return nvp.bijector.inverse(*inputs)
Je n'appelle pas tf.init_scope
n'importe où. Une version simple entraînant un calque comme semble fonctionner.
J'essaierai d'obtenir une trace plus granulaire mais je soupçonne que c'est quelque chose à voir avec les trucs en mode non désireux.
PDATE: donc cela vient définitivement du self.loss
inclusion dans une couche de ruban dégradé. Quelle est la bonne façon de procéder?
MISE À JOUR: cela vient certainement de l'inclusion self.loss dans une couche de ruban dégradé. Quelle est la bonne façon de procéder?
Je pense que la bonne façon de procéder est de
self.add_loss(<your loss tensor>)
( https://www.tensorflow.org/api_docs/python/tf/keras/layers/Layer#add_loss pour en savoir plus à ce sujet)
(modifier désolé, je ne faisais pas attention à la date de votre message, donc je suppose que ce n'était plus très utile lol)