如何在tensorflow中使用指定的掩码平均张量轴

时间:2018-01-22 05:22:37

标签: python tensorflow artificial-intelligence conv-neural-network

例如:

我有一个输入tensor(input),形状为(?,10) dtype=float32,第一维意味着batch_size

掩码tensor(mask),塑造(?,10)mask[sample_number][True,True,False,...]类似,表示面具

标签张量(avg_label),形状(?,),表示每个样本的掩蔽位置的正确平均值

我想训练模型,但无法找到获得输出的好方法。

tf.reduce_... (例如 tf.reduce_mean )函数似乎不支持关于屏蔽的参数。

我尝试 tf.boolean_mask ,但它会将输出形状展平为只有一个维度,抛出sample_number维度,因此无法区分样本

我考虑过 tf.where ,例如:

masked=tf.where(mask,input,tf.zeros(tf.shape(input)))
avg_out=tf.reduce_mean(masked,axis=1)
loss=tf.pow(avg_out-avg_label,2)

但上面的代码肯定不起作用,因为False设置为0将改变平均值。如果使用np.nan,它将总是得到nan。我想知道在进行减少操作时是否存在表示缺席的值。

我该怎么做?

3 个答案:

答案 0 :(得分:0)

您可以通过计算面具中的非消失条目来编写自己的均值函数

为什么不

import tensorflow as tf
import numpy as np

B, H, W, C = 5, 224, 224, 3

data = np.random.randn(B, H, W, C).astype(np.float32)
mask = np.random.randint(2, size=(B, H, W, C)).astype(np.float32)

expected = (data * mask).sum(axis=(1, 2, 3), keepdims=True)
expected = expected / mask.sum(axis=(1, 2, 3), keepdims=True)

data_op = tf.convert_to_tensor(data)
mask_op = tf.convert_to_tensor(mask)

actual_op = tf.reduce_sum(tf.multiply(data, mask), axis=[1, 2, 3], keepdims=True) / tf.reduce_sum(mask, axis=[1, 2, 3], keepdims=True)

with tf.Session() as sess:
    actual = sess.run(actual_op)

np.testing.assert_allclose(actual, expected)

答案 1 :(得分:0)

您可以使用tf.boolean_mask。

In [17]: tensor = tf.constant([[1, 2], [3, 4], [5, 6]])
In [18]: mask = np.array([[True, False], [False, True], [True, False]])
In [19]: masked = tf.boolean_mask(tensor, mask)
In [20]: masked.eval()
Out[20]: array([1, 4, 5], dtype=int32)
In [21]: tf.reduce_mean(masked).eval()
Out[21]: 3

对于False蒙版值,您可以使用tf.logical_not切换蒙版。

答案 2 :(得分:0)

您可以使用tf.ragged.boolean_mask来保持尺寸。

tf.reduce_mean(tf.ragged.boolean_mask(x, mask=mask), axis=1)