2017-10-02 3 views
1

Ich möchte meine Reihe von Zeilen mit mehreren Mitteln zentrieren und mehrere Sätze von zentrierten Zeilen erhalten.Wie Dimension Broadcast im Tensorflow zu steuern?

hat Meine Daten Form von (4, 3) das heißt vier 3D-Vektoren:

data = tf.get_variable("myvar1", shape=[4, 3], dtype=tf.float64) 

Ich habe zwei Zentren (zwei 3D-Vektoren):

mu = tf.get_variable("mu", initializer=tf.constant(np.arange(2*3).reshape(2, 3), dtype=tf.float64)) 

Ich würde Daten wie pro jeweils mu einmal zu zentrieren. In numpy würde ich Schleife schreiben:

data = np.arange(4 * 3).reshape(4, 3) 
mu = np.arange(2*3).reshape(2, 3) 

centered_data = np.empty((2, 4, 3)) 
for i_data in range(len(data)): 
    for i_mu in range(len(mu)): 
     centered = data[i_data] - mu[i_mu] 
     centered_data[i_mu, i_data, :] = centered 

Wie man dasselbe im Tensorflow tut?

Bulk-Methode für numpy würde auch geschätzt werden!

Antwort

1

Offenbar kann ich singuläre Dimension einfügen Rundfunk provozieren:

data = tf.get_variable("myvar1", shape=[4, 3], dtype=tf.float64) 
mu = tf.get_variable("mu", initializer=tf.constant(np.arange(2*3).reshape(2, 3), dtype=tf.float64)) 

centered_data = data - tf.expand_dims(mu, axis=1) 

with tf.Session() as sess: 

    sess.run(tf.global_variables_initializer()) 

    ans_value, centered_data_value, mu_value = sess.run([centered_data, data, mu], {data: np.arange(4 * 3).reshape(4, 3)}) 

    print("centered_data_value: ", centered_data_value) 
    print("mu: ", mu_value) 
    print("ans: ", ans_value) 

Das gleiche in numpy ist:

mu = np.reshape(mu, (2, 1, 3)) 
centered_data = data - mu 
0

Sie brauchen nur - oder tf.substract verwenden, wird es Element wiese Betrieb dann tun:

centered_data = tf.substract(data, mu) 
+0

Sie subtrahieren einen Mittelwertvektor aus dem Datensatz ist nur normale Sendung, während ich mehrere abziehen möchte – Dims

Verwandte Themen