[英]tensorflow_probability subclassing JointDistributionNamed __init__ behaviour
我试图创建一个派生类JointDistributionNamed
在tensorflow_probability
库(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
字典。 但是为什么这取决于我是否首先分配给self
会有所不同? 无论如何,我不是传递了对完全相同字典的引用吗? 有什么不同吗? 这是一个奇怪的错误还是我做错了什么? 如果我组成自己的简单自定义类而不是JointDistributionNamed
,则完全相同的事情似乎工作得很好。
我的预感与tf.Module
依赖项跟踪包装器对象有关。 什么是type(self.models)
? 如果您更改为self._models = self._no_dependency(models)
是否有效?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.