我有一个形状张量[x, y]
,我想减去平均值并按行标准差除(即我想为每一行做一次)。在TensorFlow中执行此操作的最有效方法是什么?
当然我可以循环遍历行:
new_tensor = [i - tf.reduce_mean(i) for i in old_tensor]
...减去均值,然后做类似的事情找到标准偏差并除以它,但这是在TensorFlow中做到这一点的最佳方法吗?
答案 0 :(得分:8)
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广播语义)。