TensorFlow中的有效方法减去每行的标准deivation的均值和除法

时间:2016-08-01 19:00:42

标签: tensorflow

我有一个形状张量[x, y],我想减去平均值并按行标准差除(即我想为每一行做一次)。在TensorFlow中执行此操作的最有效方法是什么?

当然我可以循环遍历行:

new_tensor = [i - tf.reduce_mean(i) for i in old_tensor]

...减去均值,然后做类似的事情找到标准偏差并除以它,但这是在TensorFlow中做到这一点的最佳方法吗?

2 个答案:

答案 0 :(得分:8)

  1. 沿轴1计算力矩(在您的情况下为y)并保持尺寸,即均值和var的形状为(len(x),1)
  2. 减去平均值并除以标准差(即方差的平方根)
  3. mean, var = tf.nn.moments(old_tensor, [1], keep_dims=True)
    new_tensor = tf.div(tf.subtract(old_tensor, mean), tf.sqrt(var))
    

答案 1 :(得分:6)

TensorFlow tf.sub()tf.div()运营商支持广播,因此您无需遍历每一行。让我们考虑均值,并将标准偏差作为练习:

old_tensor = ...                                          # shape = (x, y)
mean = tf.reduce_mean(old_tensor, 1, keep_dims=True)      # shape = (x, 1)                    

stdev = ...                                               # shape = (x,)
stdev = tf.expand_dims(stdev, 1)                          # shape = (x, 1)

new_tensor = old_tensor - mean                            # shape = (x, y)
new_tensor = old_tensor / stdev                           # shape = (x, y)

减法和除法运算符隐式地在列维度上广播形状(x, 1)的张量,以匹配另一个参数(x, y)的形状。有关广播如何工作的更多详细信息,请参阅NumPy documentation on the topic(TensorFlow实现NumPy广播语义)。