【问题标题】:tensorflow_probability subclassing JointDistributionNamed __init__ behaviourtensorflow_probability 子类化 JointDistributionNamed __init__ 行为
【发布时间】:2019-12-13 11:01:26
【问题描述】:

我正在尝试从tensorflow_probability 库中的JointDistributionNamed 创建派生类(tensorflow v2.0.0,tensorflow_probability v0.8.0)。但是,super().__init__ 函数的行为方式很奇怪,我不明白。也许我只是错误地使用了super(),但它似乎可以像我期望的那样对其他类起作用。无论如何,这是一个例子:

from tensorflow_probability import distributions as tfd

models = {'normal': tfd.Normal(loc=0, scale=1)}
joint = tfd.JointDistributionNamed(models) # Works perfectly fine
print("joint:",joint) 

class Test(tfd.JointDistributionNamed):
    def __init__(self,name,models):
        self.myname = name
        self.models = models
        super().__init__(models) #(1) Works
        #super().__init__(self.models) #(2) Doesn't work

t = Test('hello',models)
print("t:", t)

models 赋予super().__init__ 时的行为是不一样的,无论我只是将models 传入还是先将其分配给self.models。为什么?在后一种情况下,我收到以下错误:

Traceback (most recent call last):
  File "test_jointdistnamed.py", line 18, in <module>
    t = Test('hello',models)
  File "</home/farmer/anaconda3/envs/tensorflow/lib/python3.7/site-packages/decorator.py:decorator-gen-244>", line 2, in __init__
  File "/home/farmer/anaconda3/envs/tensorflow/lib/python3.7/site-packages/tensorflow_probability/python/distributions/distribution.py", line 276, in wrapped_init
    default_init(self_, *args, **kwargs)
  File "test_jointdistnamed.py", line 16, in __init__
    super().__init__(self.models) #doesn't work
  File "</home/farmer/anaconda3/envs/tensorflow/lib/python3.7/site-packages/decorator.py:decorator-gen-138>", line 2, in __init__
  File "/home/farmer/anaconda3/envs/tensorflow/lib/python3.7/site-packages/tensorflow_probability/python/distributions/distribution.py", line 276, in wrapped_init
    default_init(self_, *args, **kwargs)
  File "/home/farmer/anaconda3/envs/tensorflow/lib/python3.7/site-packages/tensorflow_probability/python/distributions/joint_distribution_named.py", line 170, in __init__
    model, validate_args, name or 'JointDistributionNamed')
  File "</home/farmer/anaconda3/envs/tensorflow/lib/python3.7/site-packages/decorator.py:decorator-gen-70>", line 2, in __init__
  File "/home/farmer/anaconda3/envs/tensorflow/lib/python3.7/site-packages/tensorflow_probability/python/distributions/distribution.py", line 276, in wrapped_init
    default_init(self_, *args, **kwargs)
  File "/home/farmer/anaconda3/envs/tensorflow/lib/python3.7/site-packages/tensorflow_probability/python/distributions/joint_distribution_sequential.py", line 211, in __init__
    self._model_unflatten(self._model_flatten(model))
  File "/home/farmer/anaconda3/envs/tensorflow/lib/python3.7/site-packages/tensorflow_probability/python/distributions/joint_distribution_named.py", line 186, in _model_unflatten
    return type(self.model)(**kwargs)
TypeError: __init__() got an unexpected keyword argument 'normal'

这就像它出于某种原因试图在类层次结构中的某处解压models dict。但是为什么这取决于我是否首先分配给self?无论哪种方式,我不是都在传递对完全相同的字典的引用吗?有什么不同吗?这是一个奇怪的错误还是我做错了什么?如果我编写自己的简单自定义类而不是 JointDistributionNamed,那么完全相同的事情似乎也可以正常工作。

【问题讨论】:

    标签: python tensorflow2.0 tensorflow-probability


    【解决方案1】:

    我的预感与tf.Module 字段的依赖跟踪包装对象有关。 type(self.models) 是什么?如果你换成self._models = self._no_dependency(models) 可以吗?

    【讨论】:

      猜你喜欢
      • 2013-06-20
      • 2019-07-29
      • 2011-01-03
      • 2010-12-06
      • 2011-08-07
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多