【问题标题】:Sample from a tensor in Tensorflow along an axis沿轴从 Tensorflow 中的张量采样
【发布时间】:2016-09-11 01:53:44
【问题描述】:

我有一个形状为(2,5,2) 的矩阵L。沿最后一个轴的值​​形成概率分布。我想对另一个形状为(2, 5) 的矩阵S 进行采样,其中每个条目都是以下整数之一:0, 1。 例如,

L = [[[0.1, 0.9],[0.2, 0.8],[0.3, 0.7],[0.5, 0.5],[0.6, 0.4]],
     [[0.5, 0.5],[0.9, 0.1],[0.7, 0.3],[0.9, 0.1],[0.1, 0.9]]]

其中一个样本可能是,

S = [[1, 1, 1, 0, 1],
     [1, 1, 1, 0, 1]]

在上面的例子中分布是二项式的。不过一般L的最后一个维度可以是任意正整数,所以分布可以是多项式

样本需要在 Tensorflow 计算图中高效生成。我知道如何使用 numpy 使用函数 apply_along_axisnumpy.random.multinomial 来做到这一点。

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    您可以在此处使用tf.multinomial()

    您首先需要将输入张量整形为[-1, N](其中NL 的最后一个维度):

    # L has shape [2, 5, 2]
    L = tf.constant([[[0.1, 0.9],[0.2, 0.8],[0.3, 0.7],[0.5, 0.5],[0.6, 0.4]],
                     [[0.5, 0.5],[0.9, 0.1],[0.7, 0.3],[0.9, 0.1],[0.1, 0.9]]])
    
    dims = L.get_shape().as_list()
    N = dims[-1]  # here N = 2
    
    logits = tf.reshape(L, [-1, N])  # shape [10, 2]
    

    现在我们可以将函数tf.multinomial() 应用到logits

    samples = tf.multinomial(logits, 1)
    # We reshape to match the initial shape minus the last dimension
    res = tf.reshape(samples, dims[:-1])
    

    【讨论】:

      【解决方案2】:

      使用tf.multinomial() 时要小心。该函数的输入应该是对数而不是概率分布。 但是,在您的示例中,最后一个轴是概率分布。

      【讨论】:

        猜你喜欢
        • 2016-05-01
        • 2018-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多