我需要对多维张量进行加权采样。
我的形状A
的张量[X,Y]
和形状B
的概率分布[X]
。
我需要根据分布N
对来自A
的{{1}}元素进行抽样。
B
表示子指标的分布。每个子传感器内的采样是一致的。
A中有一些填充,所以我必须考虑到这一点。什么是填充的信息包含在掩码中。
e.g
B
我能够从A = [[1, 2, 3, X, X, X],
[10, 20, 30, X, X, X],
[100, 200, 300, 400, 500, 600]]
A_mask = [[T, T, T, F, F, F],
[T, T, T, F, F, F],
[T, T, T, T, T, T]]
B = [0.5, 0.4, 0.1]
# a possible output, with N = 10
ouput = [1, 1, 2, 2, 3, 10, 20, 30, 30, 200]
的每个嵌套张量中检索要采样的元素数量:
A
对于这些数字中的每一个,我必须在该子传感器中执行统一采样。
我能为每个子传感器计算 maxvalue 。
tf.multinomial(tf.log(probability_distribution), N)
# a possible output of that function, with N = 10, is:
[1, 1, 1, 1, 1, 2, 2, 2, 2, 3]
此时,对于多项函数返回的每个子指标,我应该在subtensor_sizes = tf.reduce_sum(tf.cast(A_mask, tf.int32), axis=1)
# it would return: [3, 3, 6]
和0
之间执行统一采样(或者类似地,计算事件和样本maxvalue
元素来自在多项式输出中出现T
次的子指标。)
我不确定如何处理,怎么办呢?
答案 0 :(得分:1)
所以你有张量A
包含不同长度的序列。您希望从这些序列中提取值,使用不同的概率B
为每个序列选择一个值。
您可以按以下步骤操作:
import tensorflow as tf
A = tf.constant(
[[1, 2, 3, -1, -1, -1],
[10, 20, 30, -1, -1, -1],
[100, 200, 300, 400, 500, 600]])
A_mask = tf.constant(
[[True, True, True, False, False, False],
[True, True, True, False, False, False],
[True, True, True, True, True, True]])
B = tf.constant([0.5, 0.4, 0.1])
subtensor_sizes = tf.reduce_sum(tf.cast(A_mask, tf.int32), axis=1)
# get random sample index
output = tf.to_int32(tf.multinomial(tf.log(B[None]), 10)[0])
# get corresponding sample size
output_sizes = tf.gather(subtensor_sizes, output)
# generate a random index in each range
random_idxs = tf.map_fn(
lambda x: tf.random_uniform((), maxval=x, dtype=tf.int32), output_sizes)
# construct nd-index for tf.gather
random_ndxs = tf.concat([output[:, None], random_idxs[:, None]], axis=-1)
# get sample values
random_samples = tf.gather_nd(A, random_ndxs)