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

loc*_*cys 2 python artificial-intelligence conv-neural-network tensorflow

例如:

我有一个输入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)
Run Code Online (Sandbox Code Playgroud)

但是上面的代码肯定不起作用,因为 False 设置为 0 会改变 avg。如果使用 np.nan ,它总是会得到 nan 。我想知道在做reduce操作时是否有一个表示缺席的值。

我怎样才能做到这一点?

Ler*_*ang 5

您可以使用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
Run Code Online (Sandbox Code Playgroud)

对于 False 掩码值,您可以使用 tf.logic_not 来切换掩码。


Lan*_*o-L 5

您可以使用tf.ragged.boolean_mask来保持维度。

tf.reduce_mean(tf.ragged.boolean_mask(x, mask=mask), axis=1)
Run Code Online (Sandbox Code Playgroud)