簡體   English   中英

tensorflow_probability 子類化 JointDistributionNamed __init__ 行為

[英]tensorflow_probability subclassing JointDistributionNamed __init__ behaviour

我試圖創建一個派生類JointDistributionNamedtensorflow_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)

modelssuper().__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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM