Python 如何为TensorFlow中的矢量化参数设置双射体?

Python 如何为TensorFlow中的矢量化参数设置双射体?,python,tensorflow,tensorflow-probability,Python,Tensorflow,Tensorflow Probability,我将遵循本教程第3个示例中关于的逻辑。然而,我的设置中的一个不同点是,我的振幅和长度_标度是向量。但是,我很难为矢量化参数设置双射体 # Create a list to save all variables to be iterated. initial_chain_states = [ tf.ones([1, num_GPs], dtype=tf.float32, name="init_amp_1"), tf.ones([1, num_GPs], dtype=tf.float

我将遵循本教程第3个示例中关于的逻辑。然而,我的设置中的一个不同点是,我的振幅长度_标度是向量。但是,我很难为矢量化参数设置双射体

# Create a list to save all variables to be iterated.
initial_chain_states = [
    tf.ones([1, num_GPs], dtype=tf.float32, name="init_amp_1"),
    tf.ones([1, num_GPs], dtype=tf.float32, name="init_scale_1"),
    tf.ones([1, num_GPs], dtype=tf.float32, name="init_amp_0"),
    tf.ones([1, num_GPs], dtype=tf.float32, name="init_scale_0"),
    tf.ones([], dtype=tf.float32, name="init_sigma_sq_1"),
    tf.ones([], dtype=tf.float32, name="init_sigma_sq_0")
]

vectorized_sp = tfb.Softplus(hinge_softness=np.ones([1, num_GPs], dtype=np.float32))

unconstrained_bijectors = [
    vectorized_sp,
    vectorized_sp,
    vectorized_sp,
    vectorized_sp,
    tfp.bijectors.Softplus(),
    tfp.bijectors.Softplus()
]

def un_normalized_log_posterior(amplitude_1, length_scale_1,
                                amplitude_0, length_scale_0,
                                noise_var_1, noise_var_0):
    return compute_joint_log_prob_3(
        para_index, delayed_signal, y_type,
        amplitude_1, length_scale_1, amplitude_0, length_scale_0,
        noise_var_1, noise_var_0
    )

num_results = 200
[
    amps_1,
    scales_1,
    amps_0,
    scales_0,
    sigma_sqs_1,
    sigma_sqs_0
], kernel_results = tfp.mcmc.sample_chain(
    num_results=num_results,
    num_burnin_steps=250,
    num_steps_between_results=3,
    current_state=initial_chain_states,
    kernel=tfp.mcmc.TransformedTransitionKernel(
        inner_kernel=tfp.mcmc.HamiltonianMonteCarlo(
            target_log_prob_fn=un_normalized_log_posterior,
            step_size=np.float32(0.1),
            num_leapfrog_steps=3,
            step_size_update_fn=tfp.mcmc.make_simple_step_size_update_policy(
                num_adaptation_steps=100)),
        bijector=unconstrained_bijectors))
我尝试了官方示例教程中的一种方法(并搜索关键字“Batching Bijectors”)

他们用

softplus = tfp.bijectors.Softplus(
  hinge_softness=[1., .5, .1])
print("Hinge softness shape:", softplus.hinge_softness.shape)
为标量参数更改Softplus的形状。但控制台一直显示相同的错误消息

My
compute_joint_log_prob_3
仅输出给定所有数据和参数的标量对数后验概率。我已经测试过这个函数运行得很好。唯一的问题是在存在向量化内核超参数的情况下设置无约束的对象

# Create a list to save all variables to be iterated.
initial_chain_states = [
    tf.ones([1, num_GPs], dtype=tf.float32, name="init_amp_1"),
    tf.ones([1, num_GPs], dtype=tf.float32, name="init_scale_1"),
    tf.ones([1, num_GPs], dtype=tf.float32, name="init_amp_0"),
    tf.ones([1, num_GPs], dtype=tf.float32, name="init_scale_0"),
    tf.ones([], dtype=tf.float32, name="init_sigma_sq_1"),
    tf.ones([], dtype=tf.float32, name="init_sigma_sq_0")
]

vectorized_sp = tfb.Softplus(hinge_softness=np.ones([1, num_GPs], dtype=np.float32))

unconstrained_bijectors = [
    vectorized_sp,
    vectorized_sp,
    vectorized_sp,
    vectorized_sp,
    tfp.bijectors.Softplus(),
    tfp.bijectors.Softplus()
]

def un_normalized_log_posterior(amplitude_1, length_scale_1,
                                amplitude_0, length_scale_0,
                                noise_var_1, noise_var_0):
    return compute_joint_log_prob_3(
        para_index, delayed_signal, y_type,
        amplitude_1, length_scale_1, amplitude_0, length_scale_0,
        noise_var_1, noise_var_0
    )

num_results = 200
[
    amps_1,
    scales_1,
    amps_0,
    scales_0,
    sigma_sqs_1,
    sigma_sqs_0
], kernel_results = tfp.mcmc.sample_chain(
    num_results=num_results,
    num_burnin_steps=250,
    num_steps_between_results=3,
    current_state=initial_chain_states,
    kernel=tfp.mcmc.TransformedTransitionKernel(
        inner_kernel=tfp.mcmc.HamiltonianMonteCarlo(
            target_log_prob_fn=un_normalized_log_posterior,
            step_size=np.float32(0.1),
            num_leapfrog_steps=3,
            step_size_update_fn=tfp.mcmc.make_simple_step_size_update_policy(
                num_adaptation_steps=100)),
        bijector=unconstrained_bijectors))
它应该会起作用,模型会抽取这些参数的样本。相反,我收到了一堆错误信息,上面说

Traceback (most recent call last):
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow/python/framework/ops.py", line 1659, in _create_c_op
    c_op = c_api.TF_FinishOperation(op_desc)
tensorflow.python.framework.errors_impl.InvalidArgumentError: Requires start <= limit when delta > 0: 1/0 for 'mcmc_sample_chain/transformed_kernel_bootstrap_results/mh_bootstrap_results/hmc_kernel_bootstrap_results/maybe_call_fn_and_grads/value_and_gradients/softplus_10/forward_log_det_jacobian/range' (op: 'Range') with input shapes: [], [], [] and with computed input tensors: input[0] = <1>, input[1] = <0>, input[2] = <1>.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/runpy.py", line 183, in _run_module_as_main
    mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/runpy.py", line 109, in _get_module_details
    __import__(pkg_name)
  File "/MMAR_q/MMAR_q.py", line 237, in <module>
    bijector=unconstrained_bijectors))
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow_probability/python/mcmc/sample.py", line 235, in sample_chain
    previous_kernel_results = kernel.bootstrap_results(current_state)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow_probability/python/mcmc/transformed_kernel.py", line 344, in bootstrap_results
    transformed_init_state))
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow_probability/python/mcmc/hmc.py", line 518, in bootstrap_results
    kernel_results = self._impl.bootstrap_results(init_state)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow_probability/python/mcmc/metropolis_hastings.py", line 264, in bootstrap_results
    pkr = self.inner_kernel.bootstrap_results(init_state)
  File "/MAR_q/venv/lib/python3.7/site-packages/tensorflow_probability/python/mcmc/hmc.py", line 687, in bootstrap_results
    ] = mcmc_util.maybe_call_fn_and_grads(self.target_log_prob_fn, init_state)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow_probability/python/mcmc/util.py", line 237, in maybe_call_fn_and_grads
    result, grads = _value_and_gradients(fn, fn_arg_list, result, grads)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow_probability/python/mcmc/util.py", line 185, in _value_and_gradients
    result = fn(*fn_arg_list)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow_probability/python/mcmc/transformed_kernel.py", line 204, in new_target_log_prob
    event_ndims=event_ndims)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow_probability/python/mcmc/transformed_kernel.py", line 51, in fn
    for b, e, sp in zip(bijector, event_ndims, transformed_state_parts)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow_probability/python/mcmc/transformed_kernel.py", line 51, in <listcomp>
    for b, e, sp in zip(bijector, event_ndims, transformed_state_parts)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow_probability/python/bijectors/bijector.py", line 1205, in forward_log_det_jacobian
    return self._call_forward_log_det_jacobian(x, event_ndims, name)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow_probability/python/bijectors/bijector.py", line 1177, in _call_forward_log_det_jacobian
    kwargs=kwargs)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow_probability/python/bijectors/bijector.py", line 982, in _compute_inverse_log_det_jacobian_with_caching
    event_ndims)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow_probability/python/bijectors/bijector.py", line 1272, in _reduce_jacobian_det_over_event
    axis=self._get_event_reduce_dims(min_event_ndims, event_ndims))
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow_probability/python/bijectors/bijector.py", line 1284, in _get_event_reduce_dims
    return tf.range(-reduce_ndims, 0)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow/python/ops/math_ops.py", line 1199, in range
    return gen_math_ops._range(start, limit, delta, name=name)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow/python/ops/gen_math_ops.py", line 6746, in _range
    "Range", start=start, limit=limit, delta=delta, name=name)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow/python/framework/op_def_library.py", line 788, in _apply_op_helper
    op_def=op_def)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow/python/util/deprecation.py", line 507, in new_func
    return func(*args, **kwargs)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow/python/framework/ops.py", line 3300, in create_op
    op_def=op_def)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow/python/framework/ops.py", line 1823, in __init__
    control_input_ops)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow/python/framework/ops.py", line 1662, in _create_c_op
    raise ValueError(str(e))
ValueError: Requires start <= limit when delta > 0: 1/0 for 'mcmc_sample_chain/transformed_kernel_bootstrap_results/mh_bootstrap_results/hmc_kernel_bootstrap_results/maybe_call_fn_and_grads/value_and_gradients/softplus_10/forward_log_det_jacobian/range' (op: 'Range') with input shapes: [], [], [] and with computed input tensors: input[0] = <1>, input[1] = <0>, input[2] = <1>.
回溯(最近一次呼叫最后一次):
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow/python/framework/ops.py”,第1659行,在“创建”c_op中
c_op=c_api.TF_FinishOperation(操作说明)
tensorflow.python.framework.errors\u impl.invalidargumeinterror:需要0:1/0开始“mcmc\u样本链/转换的\u内核\u引导\u结果/mh\u引导\u结果/hmc\u内核\u引导\u结果/可能\u调用\u fn\u和\u梯度/softplus\u 10/向前\u日志\u det\u雅可比数/range”(op:“range”),输入形状:[]、[]、[]、[]使用计算的输入张量:输入[0]=,输入[1]=,输入[2]=。
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/runpy.py”,第183行,在运行模块中
模块名称,模块规格,代码=\u获取模块详细信息(模块名称,错误)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/runpy.py”,第109行,在获取模块详细信息中
__导入(包装名称)
文件“/MMAR_q/MMAR_q.py”,第237行,在
双喷射器=无约束(双喷射器)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow_probability/python/mcmc/sample.py”,第235行,在sample_链中
先前的\u内核\u结果=内核.bootstrap\u结果(当前状态)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow_probability/python/mcmc/transformed_kernel.py”,第344行,在引导结果中
转换的(初始状态)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow_probability/python/mcmc/hmc.py”,第518行,在bootstrap_结果中
内核结果=自执行引导结果(初始状态)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow_probability/python/mcmc/metropolis_hastings.py”,第264行,在引导结果中
pkr=self.internal\u kernel.bootstrap\u结果(init\u状态)
bootstrap结果中的文件“/MAR_q/venv/lib/python3.7/site packages/tensorflow_probability/python/mcmcmc/hmc.py”,第687行
]=mcmc_util.maybe_call_fn_和_grads(self.target_log_prob_fn,初始状态)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow_probability/python/mcmc/util.py”,第237行,在maybe_call_fn_和_grads中
结果,梯度=_值和_梯度(fn,fn_arg_列表,结果,梯度)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow_probability/python/mcmc/util.py”,第185行,输入值和梯度
结果=fn(*fn_参数_列表)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow_probability/python/mcmc/transformed_kernel.py”,第204行,在new_target_log_prob中
事件(ndims=事件(ndims)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow_probability/python/mcmc/transformed_kernel.py”,第51行,fn
对于zip中的b、e、sp(对象、事件、状态、转换部分)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow_probability/python/mcmc/transformed_kernel.py”,第51行,在
对于zip中的b、e、sp(对象、事件、状态、转换部分)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow_probability/python/bijectors/bijector.py”,第1205行,在forward_log_det_jacobian中
返回self.\u调用\u转发\u日志\u det\u jacobian(x,事件ndims,名称)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow_probability/python/bijectors/bijector.py”,第1177行,在调用转发日志中
kwargs=kwargs)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow_probability/python/bijectors/bijector.py”,第982行,在带有缓存的计算逆计算日志中
事件(ndims)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow_probability/python/bijectors/bijector.py”,第1272行,在“reduce_jacobian_det_over_”事件中
轴=自身。\获取\事件\减少\ dims(最小\事件\ ndims,事件\ ndims))
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow_probability/python/bijectors/bijector.py”,第1284行,在“获取事件”中
返回tf.范围(-reduce_ndims,0)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow/python/ops/math_ops.py”,第1199行,范围内
返回发电机数学运算范围(起始、极限、增量、名称=名称)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow/python/ops/gen_math_ops.py”,第6746行,在_范围内
“范围”,开始=开始,限制=限制,增量=增量,名称=名称)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow/python/framework/op_def_library.py”,第788行,在“应用”op_helper中
op_def=op_def)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow/python/util/deprecation.py”,第507行,在new_func中
返回函数(*args,**kwargs)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow/python/framework/ops.py”,第3300行,在create_op中
op_def=op_def)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow/python/framework/ops.py”,第1823行,在__
控制(输入操作)
文件“/MMAR_q/venv/lib/python3.7/site packages/tensorflow/python/framework/ops.py”,第1662行,在_create_c_op
提升值错误(str(e))
ValueError:Re