2017-10-02 1 views
1

Je voudrais centrer mon ensemble de lignes avec plusieurs moyens et obtenir plusieurs ensembles de lignes centrées.Comment contrôler la diffusion d'une dimension dans tensorflow?

Mes données a une forme de (4, 3) à savoir quatre vecteurs 3D:

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

J'ai deux centres (deux vecteurs 3D):

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

Je voudrais au centre de données une fois par chaque mu. En numpy j'écrirais en boucle:

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 

Comment faire la même chose en tensorflow?

La méthode en vrac pour numpy serait également appréciée!

Répondre

1

Apparemment, je peux insérer la dimension singulière de provoquer la diffusion:

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) 

La même chose est en numpy:

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

Vous ne devez utiliser - ou tf.substract il fera le fonctionnement sage élément alors:

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

Vous soustrayez un vecteur moyen de l'ensemble de données, ceci est juste une diffusion normale, alors que je veux soustraire plusieurs – Dims