我有一个形状的张量,[x, y]
我想减去平均值并除以行标准差(即我想为每一行做).在TensorFlow中执行此操作的最有效方法是什么?
当然我可以循环遍历行,如下所示:
new_tensor = [i - tf.reduce_mean(i) for i in old_tensor]
...减去均值,然后做类似的事情找到标准差并除以它,但这是在TensorFlow中做到这一点的最佳方法吗?
沿轴1计算力矩(在你的情况下为y)并保持尺寸,即均值和var的形状是(len(x),1)
减去平均值并除以标准差(即方差的平方根)
mean, var = tf.nn.moments(old_tensor, [1], keep_dims=True) new_tensor = tf.div(tf.subtract(old_tensor, mean), tf.sqrt(var))
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文档(TensorFlow实现NumPy广播语义).