Python 节理分布序列样本对数概率的张量流概率误差

Python 节理分布序列样本对数概率的张量流概率误差,python,tensorflow,tensorflow2.0,tensorflow-probability,Python,Tensorflow,Tensorflow2.0,Tensorflow Probability,嗨,我正在试图弄清楚我是否在TFP形状上犯了错误,或者这是一个TFP错误。我可以从这个简单的联合分布中取样,它使用一个3维多元正态平均值上的正态先验,以及一个半柯西分布上的3个先验,作为MVN协方差对角线上的先验 我使用的是tensorflow 2.2.0,这个错误发生在tensorflow概率0.10.1和几乎构建的tensorflow概率0.12.0-dev20200719上 此代码应独立运行: 将tensorflow导入为tf 导入tensorflow_概率作为tfp tfd=tfp 节理

嗨,我正在试图弄清楚我是否在TFP形状上犯了错误,或者这是一个TFP错误。我可以从这个简单的联合分布中取样,它使用一个3维多元正态平均值上的正态先验,以及一个半柯西分布上的3个先验,作为MVN协方差对角线上的先验

我使用的是tensorflow 2.2.0,这个错误发生在tensorflow概率0.10.1和几乎构建的tensorflow概率0.12.0-dev20200719上

此代码应独立运行:

将tensorflow导入为tf
导入tensorflow_概率作为tfp
tfd=tfp
节理_模型=tfd。节理分布顺序([
tfd.正常(loc=0,scale=1,name='z_0'),
tfd.HalfCauchy(loc=tf.zeros([3]),scale=2,name='lambda_k'),
lambda lambda_k,z_0:tfd.多变量非线性诊断(#z_k~MVN(z_0,lambda_k)
loc=z_0[…,tf.newaxis],
比例图=λk,
name='z_k'),
])
#这些工作
joint_model.sample()
关节模型样本(4)
joint\u model.log\u prob(joint\u model.sample())
#这打破了
节理模型.测井概率(节理模型.样本(4))
以下是错误消息:

---------------------------------------------------------------------------
InvalidArgumentError                      Traceback (most recent call last)
<ipython-input-41-61bae7ab690a> in <module>
      1 joint_model.log_prob(joint_model.sample())
      2 # ERROR
----> 3 joint_model.log_prob(joint_model.sample(4))

~/miniconda3/envs/latent2/lib/python3.7/site-packages/tensorflow_probability/python/distributions/joint_distribution.py in log_prob(self, *args, **kwargs)
    479         model_flatten_fn=self._model_flatten,
    480         model_unflatten_fn=self._model_unflatten)
--> 481     return self._call_log_prob(value, **unmatched_kwargs)
    482 
    483   # Override the base method to capture *args and **kwargs, so we can

~/miniconda3/envs/latent2/lib/python3.7/site-packages/tensorflow_probability/python/distributions/distribution.py in _call_log_prob(self, value, name, **kwargs)
    944     with self._name_and_control_scope(name, value, kwargs):
    945       if hasattr(self, '_log_prob'):
--> 946         return self._log_prob(value, **kwargs)
    947       if hasattr(self, '_prob'):
    948         return tf.math.log(self._prob(value, **kwargs))

~/miniconda3/envs/latent2/lib/python3.7/site-packages/tensorflow_probability/python/distributions/joint_distribution.py in _log_prob(self, value)
    391   def _log_prob(self, value):
    392     xs = self._map_measure_over_dists('log_prob', value)
--> 393     return sum(maybe_check_wont_broadcast(xs, self.validate_args))
    394 
    395   @distribution_util.AppendDocstring(kwargs_dict={

~/miniconda3/envs/latent2/lib/python3.7/site-packages/tensorflow/python/ops/math_ops.py in binary_op_wrapper(x, y)
    982     with ops.name_scope(None, op_name, [x, y]) as name:
    983       if isinstance(x, ops.Tensor) and isinstance(y, ops.Tensor):
--> 984         return func(x, y, name=name)
    985       elif not isinstance(y, sparse_tensor.SparseTensor):
    986         try:

~/miniconda3/envs/latent2/lib/python3.7/site-packages/tensorflow/python/ops/math_ops.py in _add_dispatch(x, y, name)
   1274     return gen_math_ops.add(x, y, name=name)
   1275   else:
-> 1276     return gen_math_ops.add_v2(x, y, name=name)
   1277 
   1278 

~/miniconda3/envs/latent2/lib/python3.7/site-packages/tensorflow/python/ops/gen_math_ops.py in add_v2(x, y, name)
    478         pass  # Add nodes to the TensorFlow graph.
    479     except _core._NotOkStatusException as e:
--> 480       _ops.raise_from_not_ok_status(e, name)
    481   # Add nodes to the TensorFlow graph.
    482   _, _, _op, _outputs = _op_def_library._apply_op_helper(

~/miniconda3/envs/latent2/lib/python3.7/site-packages/tensorflow/python/framework/ops.py in raise_from_not_ok_status(e, name)
   6651   message = e.message + (" name: " + name if name is not None else "")
   6652   # pylint: disable=protected-access
-> 6653   six.raise_from(core._status_to_exception(e.code, message), None)
   6654   # pylint: enable=protected-access
   6655 

~/miniconda3/envs/latent2/lib/python3.7/site-packages/six.py in raise_from(value, from_value)

InvalidArgumentError: Incompatible shapes: [4] vs. [4,3] [Op:AddV2]
---------------------------------------------------------------------------
InvalidArgumentError回溯(最后一次最近调用)
在里面
1 joint\u model.log\u prob(joint\u model.sample())
2#错误
---->3节理模型测井概率(节理模型样本(4))
日志prob中的~/miniconda3/envs/latent2/lib/python3.7/site-packages/tensorflow\u probability/python/distributions/joint\u distribution.py(self,*args,**kwargs)
479模型\u展平\u fn=自。\u模型\u展平,
480型号\u未整平\u fn=自身。\u型号\u未整平)
-->481返回self.\u调用\u日志\u prob(值,**不匹配\u kwargs)
482
483#重写基本方法以捕获*args和**kwargs,这样我们就可以
~/miniconda3/envs/latent2/lib/python3.7/site-packages/tensorflow\u probability/python/distributions/distribution.py in\u call\u log\u prob(self、value、name、**kwargs)
944,具有自我名称和控制范围(名称、值、kwargs):
945如果hasattr(自身,“\u log\u prob”):
-->946返回self.\u log\u prob(值,**kwargs)
947如果hasattr(自我,“u prob”):
948返回tf.math.log(self._prob(值,**kwargs))
~/miniconda3/envs/latent2/lib/python3.7/site-packages/tensorflow\u probability/python/distributions/joint\u distribution.py in\u log\u prob(self,value)
391 def_log_prob(自身,值):
392 xs=自映射测量距离('log_prob',值)
-->393返回和(可能检查不会广播(xs,self.validate参数))
394
395@distribution_util.AppendDocstring(kwargs_dict={
二进制op_包装中的~/miniconda3/envs/latent2/lib/python3.7/site-packages/tensorflow/python/ops/math_ops.py(x,y)
982操作名称\范围(无,操作名称,[x,y])作为名称:
983如果isinstance(x,运算张量)和isinstance(y,运算张量):
-->984返回函数(x,y,name=name)
985 elif不存在(y,稀疏张量,稀疏传感器):
986尝试:
~/miniconda3/envs/latent2/lib/python3.7/site-packages/tensorflow/python/ops/math\u ops.py in\u add\u dispatch(x,y,name)
1274返回gen_math_ops.add(x,y,name=name)
1275其他:
->1276返回gen_math_ops.add_v2(x,y,name=name)
1277
1278
add_v2中的~/miniconda3/envs/latent2/lib/python3.7/site-packages/tensorflow/python/ops/gen_math_ops.py(x,y,name)
478通过#将节点添加到TensorFlow图。
479除“核心”外,其他状态除外,如e:
-->480运行。从不正常状态(e,名称)提升
481#将节点添加到TensorFlow图。
482 u,u,u op,_outputs=_op_def_库。_apply_op_helper(
~/miniconda3/envs/latent2/lib/python3.7/site-packages/tensorflow/python/framework/ops.py处于raise\u from\u not\u ok\u状态(e,name)
6651 message=e.message+(“名称:“+name,如果名称不是None-else”“)
6652#pylint:disable=受保护访问
->6653六。从(核心状态)提升到异常(例如代码、消息),无
6654#pylint:enable=受保护访问
6655
在raise\u from(value,from\u value)中的~/miniconda3/envs/latent2/lib/python3.7/site-packages/six.py
InvalidArgumentError:不兼容的形状:[4]与[4,3][Op:AddV2]

这让我简直疯了,非常感谢@Miles Turpin提供的解决方案参考。为了社区的利益,我在这里提供jeffpollock9在中给出的解决方案(答案部分)

在联合分布中,
batch_形
event_形
之间存在混淆,可以通过用
tfd.Independent

请参考下面的工作代码

    import tensorflow as tf
    import tensorflow_probability as tfp
    
    tfd = tfp.distributions
    
    joint_model = tfd.JointDistributionSequential([
        tfd.Normal(loc=0., scale=1., name='z_0'),
        tfd.Independent(tfd.HalfCauchy(loc=tf.zeros([3]), scale=2., name='lambda_k'), reinterpreted_batch_ndims=1),
        lambda lambda_k, z_0: tfd.MultivariateNormalDiag( # z_k ~ MVN(z_0, lambda_k)
            loc=z_0[...,tf.newaxis],
            scale_diag=lambda_k,
            name='z_k'),
    ])

print(joint_model)

print(joint_model.log_prob(joint_model.sample(4)))
输出:

tfp.distributions.JointDistributionSequential("JointDistributionSequential", batch_shape=[[], [], []], event_shape=[[], [3], [3]], dtype=[float32, float32, float32])

tf.Tensor([-14.330933  -16.854149  -15.07704    -6.9233823], shape=(4,), dtype=float32)

请参考关于形状和概率分布的推理。

感谢@Miles Turpin分享解决方案参考。为了社区的利益,我在这里提供jeffpollock9在中给出的解决方案(答案部分)

在联合分布中,
batch_形
event_形
之间存在混淆,可以通过用
tfd.Independent

请参考下面的工作代码

    import tensorflow as tf
    import tensorflow_probability as tfp
    
    tfd = tfp.distributions
    
    joint_model = tfd.JointDistributionSequential([
        tfd.Normal(loc=0., scale=1., name='z_0'),
        tfd.Independent(tfd.HalfCauchy(loc=tf.zeros([3]), scale=2., name='lambda_k'), reinterpreted_batch_ndims=1),
        lambda lambda_k, z_0: tfd.MultivariateNormalDiag( # z_k ~ MVN(z_0, lambda_k)
            loc=z_0[...,tf.newaxis],
            scale_diag=lambda_k,
            name='z_k'),
    ])

print(joint_model)

print(joint_model.log_prob(joint_model.sample(4)))
输出:

tfp.distributions.JointDistributionSequential("JointDistributionSequential", batch_shape=[[], [], []], event_shape=[[], [3], [3]], dtype=[float32, float32, float32])

tf.Tensor([-14.330933  -16.854149  -15.07704    -6.9233823], shape=(4,), dtype=float32)

请参阅关于形状和概率分布的推理。

此问题已解决,请参阅:此问题已解决,请参阅: