Tensorflow 如何将tf.softmax\u cross\u entropy\u的logits与\u logits屏蔽,以实施有效的操作

Tensorflow 如何将tf.softmax\u cross\u entropy\u的logits与\u logits屏蔽,以实施有效的操作,tensorflow,reinforcement-learning,tensor,softmax,ragged,Tensorflow,Reinforcement Learning,Tensor,Softmax,Ragged,我想计算一个批量张量的。 我有一批logits张量作为输入,但是我想在使用布尔掩码之前屏蔽这个张量。布尔掩码也是一批掩码,在每个掩码中可以有不同数量的True。 因此,将此遮罩应用于整个张量之后将不会稠密。 尝试此操作可以展平张量(tf.boolean_mask)或创建参差不齐的张量(tf.ragged.boolean_mask),这两者都会产生错误的结果或无法使用softmax函数 因此,基本上我想让以下代码正常工作: #logits.shape=(批处理,输出),例如(512,8) #mas

我想计算一个批量张量的。 我有一批logits张量作为输入,但是我想在使用布尔掩码之前屏蔽这个张量。布尔掩码也是一批掩码,在每个掩码中可以有不同数量的
True
。 因此,将此遮罩应用于整个张量之后将不会稠密。
尝试此操作可以展平张量(
tf.boolean_mask
)或创建参差不齐的张量(
tf.ragged.boolean_mask
),这两者都会产生错误的结果或无法使用softmax函数

因此,基本上我想让以下代码正常工作:

#logits.shape=(批处理,输出),例如(512,8)
#mask.shape=(批次,有效),例如(512,8)
#预期结果形状(512,)
one\u hot\u actions=tf.one\u hot(x,logits.get\u shape().as\u list()[-1])
stopgradient=tf.停止梯度(一个热动作)
返回tf.nn.softmax\u cross\u entropy\u和\u logits\u v2(
logits=tf.boolean_掩码(logits,掩码),
labels=tf.boolean_掩码(stopgradient,掩码))
但是对于
tf.boolean_mask
这只会生成一个值,而不是四个值,而对于
tf.ragged.boolean_mask
这一函数不起作用

我尝试按行梳理这两个参差不齐的张量(第一个蒙面logits行和第一个蒙面标签行),并按行计算softmax。这不起作用,因为我使用的tf.map_fn不接受参差不齐的张量作为输入。我也用SparseTensors和list of Tensor(tf.split)尝试了同样的想法,但从未从中得到任何有效的代码

我唯一能解决这个问题的想法是非常丑陋的。 用
tf.where
to
NaN
替换所有屏蔽值,然后在这些现在密集的张量上使用map\u fn。然后,我可以再次屏蔽每一行以排除NaN,现在可以再次按行调用softmax函数。
编辑这是代码当前的样子:

stopgradient=tf.stop\u gradient(一个热动作)
nan_logits=tf.where(掩码、logits、浮点('nan')+tf.zeros_like(self.logits))
nan_标签=tf.where(掩码、stopgradient、float('nan')+tf.zeros_like(stopgradient))
nan_lola=tf.stack([nan_logits,nan_labels],axis=1)
def fn(x):
nan_lo=x[0]
nan_la=x[1]
掩码逻辑掩码(nan\u lo,tf.logical\u not(tf.math.is\u nan(nan\u lo)))
掩码=tf.boolean掩码(nan\u la,tf.logical\u not(tf.math.is\u nan(nan\u la)))
返回tf.nn.softmax\u cross\u entropy\u和\u logits\u v2(
罗吉斯=蒙面,
标签=蒙面
)
结果=tf.map\u fn(fn,nan\u lola)
返回结果
这很有效,但速度很慢(我的训练时间几乎翻了一倍)

对于那些感兴趣的人:我偶然发现了这个问题,试图掩盖强化学习中的有效行为

你知道有什么办法(更快)做到这一点吗? 能否将屏蔽值替换为不影响softmax的值?
谢谢大家!

还没有答案…:我也遇到了同样的问题,并且偶然发现了它可能就是为这个用例设计的。希望它能起作用!