在Tensorflow中屏蔽来自损失函数的样本

时间:2017-10-26 23:37:21

标签: machine-learning tensorflow google-cloud-ml-engine

我有一个GCMLE实验,它在一个model_fn()中有三个学习目标(考虑这些任务A,任务B和任务C)。所有3个目标的输入是相同的(阅读文本正文),我想产生三个单独的预测。但是,对于任务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预测服务。

1 个答案:

答案 0 :(得分:0)

总结评论 - 如帖子中所述,将二元掩码应用于损失函数似乎是掩盖损失函数的适当方法。但是,减少C的有效批量大小可能会产生其他意想不到的后果,这会阻碍这种方法。