Aktualisierungswerte einer Matrixvariablen im Tensorfluss, erweiterte Indexierung

Ich möchte eine Funktion erstellen, die für jede Zeile einer gegebenen Daten X die Softmax-Funktion nur für einige abgetastete Klassen anwendet, sagen wir 2, aus K Gesamtklassen. In der einfachen python scheint der code so zu sein:

def softy(X,W, num_samples): N = X.shape[0] K = W.shape[0] S = np.zeros((N,K)) ar_to_sof = np.zeros(num_samples) sampled_ind = np.zeros(num_samples, dtype = int) for line in range(N): for samp in range(num_samples): sampled_ind[samp] = randint(0,K-1) ar_to_sof[samp] = np.dot(X[line],np.transpose(W[sampled_ind[samp]])) ar_to_sof = softmax(ar_to_sof) S[line][sampled_ind] = ar_to_sof return S 

S schließlich würde Nullen und Nicht-Werte in den Indizes enthalten, die für jede Zeile durch das Array "samped_ind" definiert wurden. Ich möchte das mit Tensorflow umsetzen. Das Problem ist, dass es enthält "erweiterte" Indizierung und ich kann nicht finden, einen Weg mit dieser Bibliothek zu erstellen, dass.

Ich versuche das mit diesem Code:

 S = tf.Variable(tf.zeros((N,K))) tfx = tf.placeholder(tf.float32,shape=(None,D)) wsampled = tf.placeholder(tf.float32, shape = (None,D)) ar_to_sof = tf.matmul(tfx,wsampled,transpose_b=True) softy = tf.nn.softmax(ar_to_sof) r = tf.random_uniform(shape=(), minval=0,maxval=K, dtype=tf.int32) ... for line in range(N): sampled_ind = tf.constant(value=[sess.run(r),sess.run(r)],dtype= tf.int32) Wsampled = sess.run(tf.gather(W,sampled_ind)) sess.run(softy,feed_dict={tfx:X[line:line+1], wsampled:Wsampled}) 

Alles funktioniert bis hier, aber ich kann keinen Weg finden, das Update zu machen, das ich in der Matrix S möchte, im Pythonschlüssel "S [line] [sampled_ind] = ar_to_sof".

Wie könnte ich diese Arbeit machen?

One Solution collect form web for “Aktualisierungswerte einer Matrixvariablen im Tensorfluss, erweiterte Indexierung”

Eine Antwort auf mein Problem wurde in der Anmerkung einer Lösung dieses Problems gefunden . Schlägt vor, auf 1d Vektor meine Matrix zu umformen. Auf diese Weise funktioniert der Code und es sieht aus wie:

 S = tf.Variable(tf.zeros(shape=(N*K))) W = tf.Variable(tf.random_uniform((K,D))) tfx = tf.placeholder(tf.float32,shape=(None,D)) sampled_ind = tf.random_uniform(dtype=tf.int32, minval=0, maxval=K-1, shape=[num_samps]) ar_to_sof = tf.matmul(tfx,tf.gather(W,sampled_ind),transpose_b=True) updates = tf.reshape(tf.nn.softmax(ar_to_sof),shape=(num_samps,)) init = tf.initialize_all_variables() sess = tf.Session() sess.run(init) for line in range(N): inds_new = sampled_ind + line*K sess.run(tf.scatter_update(S,inds_new,updates), feed_dict={tfx: X[line:line+1]}) S = tf.reshape(S,shape=(N,K)) 

Das gibt das Ergebnis zurück, das ich erwartet hatte. Das Problem ist jetzt, dass diese Implementierung zu langsam ist. Viel langsamer als die numpy Version. Vielleicht ist die for-Schleife. Irgendwelche Vorschläge?

  • TensorFlow: Max eines Tensors entlang einer Achse
  • Wie Gradient von tf.py_func übergeben wurde
  • Keras + tensorflow gibt den Fehler "kein Attribut" control_flow_ops '"
  • In Tensorflow muss ich neue op für "sinc" oder "gaussian" Aktivierungsfunktionen hinzufügen?
  • Tensorflow Queues - Umschalten zwischen Zug- und Validierungsdaten
  • Windows Tensorflow mit Python nicht in der Lage, mnist Daten aufgrund von Berechtigungen zu lesen
  • Tensorflow, Wahrscheinlichkeit des vorhergesagten Wertes?
  • Testen von Bildern auf einem Tensorflow-Modell
  • TensorFlow immer das gleiche Ergebnis
  • Tensorflow softmax_cross ... () Funktion float type error
  • TensorFlow: kritische Graphoperationen, die cpu statt gpu zugeordnet sind
  • Python ist die beste Programmiersprache der Welt.