2016-09-11 14 views
1

私は(2,5,2)の形状の行列Lを持っています。最後の軸に沿った値は、確率分布を形成する。私は別の行列Sの形状(2, 5)をサンプルします。各エントリは次の整数のいずれかです: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を使ってこれを行う方法を知っています。

答えて

3

ここでtf.multinomial()を使用できます。

最初(NLの最後の次元です)[-1, N]を形作るために、あなたの入力テンソルを再構築する必要があります。

# 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] 

今、私たちはlogitsに機能tf.multinomial()を適用することができます。

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

tf.multinomial()を使用する場合は慎重にしてください。関数への入力は確率分布ではなくlogitsでなければなりません。 しかし、あなたの例では、最後の軸は確率分布です。

関連する問題