例如:
我有一个输入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。我想知道在进行减少操作时是否存在表示缺席的值。
我该怎么做?
答案 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)