【问题标题】:How to control dimension broadcast in tensorflow?tensorflow中如何控制维度广播?
【发布时间】:2018-03-13 17:55:00
【问题描述】:

我想用几种方法使我的一组行居中,并获得几组居中的行。

我的数据形状为(4, 3),即四个 3D 向量:

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

我有两个中心(两个 3D 向量):

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

我想每亩集中一次数据。在 numpy 我会写循环:

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

如何在张量流中做同样的事情?

numpy 的批量方法也将不胜感激!

【问题讨论】:

    标签: python numpy multidimensional-array tensorflow


    【解决方案1】:

    显然我可以插入奇异维度来引发广播:

    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)
    

    在 numpy 中也是如此:

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

    【讨论】:

      【解决方案2】:

      您只需要使用-tf.substract 就会执行元素明智的操作:

      centered_data = tf.substract(data, mu)
      

      【讨论】:

      • 你是从数据集中减去一个平均向量,这只是正常的广播,而我想减去几个
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      相关资源
      最近更新 更多