web-dev-qa-db-ja.com

tensorflow 2.0:関数作成コード外の操作が渡されています

エラーが発生します:

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

次のようなNVPレイヤーを使用します。

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)

tf.init_scopeどこでも。レイヤーをトレーニングするシンプルなバージョンは機能しているようです。

もっときめ細かいトレースを取得しようとしますが、これは非イーガーモードのものと関係があるのではないかと思います。

PDATE:ですから、これは間違いなくself.lossグラデーションテープレイヤーに含まれています。これを行う正しい方法は何ですか?

9
mathtick

更新:これは間違いなく、いくつかのグラデーションテープレイヤーに含まれているself.lossによるものです。これを行う正しい方法は何ですか?

これを行う正しい方法は、

self.add_loss(<your loss tensor>)

https://www.tensorflow.org/api_docs/python/tf/keras/layers/Layer#add_loss 詳細はこちら)

(編集して申し訳ありませんが、私はあなたの投稿の日付に注意を払っていなかったので、これはもうあまり役に立ちませんでしたlol)

1
simon