多维张量的加权抽样

时间:2018-06-05 23:24:30

标签: python tensorflow

我需要对多维张量进行加权采样。

我的形状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次的子指标。)

我不确定如何处理,怎么办呢?

1 个答案:

答案 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)