我有一个GCMLE实验,它在一个model_fn()中具有三个学习目标(考虑这些任务A,任务B和任务C)。这三个目标的输入都是相同的(阅读一段正文),我想产生三个单独的预测。但是,对于任务C,我想适当地掩盖一些
批次中的示例(每个批次中约20%)。通过简单地将要掩盖的那些样本加权为零,是否是正确的方法?考虑这个损失函数。

lossA = tf.reduce_mean(tf.losses.sparse_softmax_cross_entropy(
            labels=labelsA, logits=logitsA))

lossB = tf.reduce_mean(tf.losses.sparse_softmax_cross_entropy(
            labels=labelsB, logits=logitsB))

mask_weights = tf.to_float(tf.equal(x, y)) # returns 1 if x equals y, returns 0 if x != y
lossC = tf.reduce_mean(tf.losses.sparse_softmax_cross_entropy(
            labels=labelsC, logits=logitsC, weights=mask_weights))

loss = lossA + lossB + lossC


本质上,我想做的是掩盖批处理中x!= y的所有样本,以便基于这些与taskC相关的示例,不会对模型进行梯度更新。这在想要的效果附近吗?有没有更好的方法来实现所需的行为?

我意识到我可以将它们分成单独的实验,但是我希望能够有一个共享的嵌入以及一个可以上传到GCMLE预测服务中的图形。

最佳答案

总结评论-如后所述,对损失函数应用二进制掩码似乎是掩盖损失函数的适当方法。但是,减小有效的C批次大小可能会带来其他意想不到的后果,这将不利于此方法。

关于machine-learning - 掩盖Tensorflow中损失函数的样本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46965383/

10-12 21:53