如何在tensorflow中将boolean_mask应用于onehot向量?

时间:2019-01-09 20:30:09

标签: python tensorflow

我有向量y,我也知道y的有用长度len_y。我也有onehot_y = tf.one_hot(y, n_classes),它是y的唯一代表。

我已经创建了len_y的蒙版。

这是batchsize = 2的示例

mask_y = tf.sequence_mask(len_y)
mask_y = [[True True    True    True    True    True    True    True    True],
          [True True    True    True    True    False   False   False   False]]

因此,从我的第一个元素开始,只有第9个第一个值才有用,而从第二个元素开始,只有第5个第一个值才有用。

如果像y一样将此掩码应用于tf.boolean_mask(y,mask_y),我将得到预期的结果,但是我不知道如何将其应用于onehot_y,它不会抱怨,但是会给出我扩展了结果。

这就是我要得到的(为了简单起见,将其转换为数值表示,而不是在onehot上):

y = [[0,1,2,3,4,5,6,7,8,9],
     [1,11,21,31,41,51,61,71,81,91]]

y_oh_true = tf.boolean_mask(onehot_y, mask_y)

y_oh_true = onehot_of ->[0,1,2,3,4,5,6,7,8,9,1,11,21,31]

我期望的地方:

y_oh_true = onehot_of ->[0,1,2,3,4,5,6,7,8,1,11,21,31,41]

有人知道如何解决此问题吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

好了,我在做tf.sequence_mask时必须指定maxlen

就我而言,要修复它只是:  mask_y = tf.sequence_mask(self.len_y, maxlen=tf.shape(self.y)[1])

我不清楚的是,为什么tf.boolean_mask不会抱怨形状不合适而不是做这种奇怪的事情。