I have a Keras/TensorFlow Probability model where I would like to include values from the prior layer in the convert_to_tensor_fn
parameter in the following DistributionLambda
layer. Ideally, I wish I could do something like this:
from functools import partial
import tensorflow as tf
from tensorflow.keras import layers, Model
import tensorflow_probability as tfp
from typing import Union
tfd = tfp.distributions
zero_buffer = 1e-5
def quantile(s: tfd.Distribution, q: Union[tf.Tensor, float]) -> Union[tf.Tensor, float]:
return s.quantile(q)
# 4 records (1st value represents CDF value,
# 2nd represents location,
# 3rd represents scale)
sample_input = tf.constant([[0.25, 0.0, 1.0],
[0.5, 1.0, 0.5],
[0.75, -1.0, 2.0],
[0.95, 3.0, 2.5]], dtype=tf.float32)
# Build toy model for demonstration
input_layer = layers.Input(3)
dist = tfp.layers.DistributionLambda(
make_distribution_fn=lambda t: tfd.Normal(loc=t[..., 1],
scale=zero_buffer tf.nn.softplus(t[..., 2])),
convert_to_tensor_fn=lambda t, s: partial(quantile, q=t[..., 0])(s)
)(input_layer)
model = Model(input_layer, dist)
However, according to the documentation, the convert_to_tensor_fn
is required to only take a tfd.Distribution
as input; the convert_to_tensor_fn=lambda t, s:
code doesn't work in the code above.
How can I access data from the prior layer in the convert_to_tensor_fn
? I'm assuming there's a clever way to create a partial
function, or something similar, to get this to work.
Outside of the Keras model framework, this is fairly easy to do using code similar to the example below:
# input data in Tensor Constant form
cdf_data = tf.constant([0.25, 0.5, 0.75, 0.95], dtype=tf.float32)
norm_mu = tf.constant([0.0, 1.0, -1.0, 3.0], dtype=tf.float32)
norm_scale = tf.constant([1.0, 0.5, 2.0, 2.5], dtype=tf.float32)
quant = partial(quantile, q=cdf_data)
norm = tfd.Normal(loc=norm_mu, scale=norm_scale)
quant(norm)
Output:
<tf.Tensor: shape=(4,), dtype=float32, numpy=array([-0.6744898, 1. , 0.3489796, 7.112134 ], dtype=float32)>
CodePudding user response:
the quantiles Fn is used for improving the performance of the results. It effects data presentation and calculation.