2016-09-11 2 views
1

Ich habe eine Matrix L der Form (2,5,2). Die Werte entlang der letzten Achse bilden eine Wahrscheinlichkeitsverteilung. Ich möchte eine andere Matrix S der Form (2, 5) probieren, wobei jeder Eintrag eine der folgenden ganzen Zahlen ist: 0, 1. Zum BeispielProbe von einem Tensor in Tensorflow entlang einer Achse

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

Eine der Proben, könnte

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

Die Verteilungen sind in dem obigen Beispiel binomische. Im Allgemeinen kann jedoch die letzte Dimension von L eine beliebige positive ganze Zahl sein, so dass die Verteilungen multinomial sein können.

Die Proben müssen innerhalb des Tensorflow-Berechnungsgraphen effizient erzeugt werden. Mit den Funktionen apply_along_axis und numpy.random.multinomial weiß ich, wie man das macht.

Antwort

3

Sie können tf.multinomial() hier verwenden.

Sie zuerst müssen Sie Ihre Eingabe Tensor neu zu gestalten [-1, N] zu gestalten (wo N die letzte Dimension von L ist):

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

Jetzt können wir die Funktion tf.multinomial()-logits gelten:

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

Vorsicht bei der Verwendung von tf.multinomial(). Die Eingaben für die Funktion sollten Logits und keine Wahrscheinlichkeitsverteilungen sein. In Ihrem Beispiel ist die letzte Achse jedoch eine Wahrscheinlichkeitsverteilung.

Verwandte Themen