首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Tensorflow中,损失权重是如何工作的?

在Tensorflow中,损失权重是如何工作的?
EN

Stack Overflow用户
提问于 2018-11-13 14:18:49
回答 1查看 4.1K关注 0票数 3

我正在对一个代表严重不足的目标类进行递归二进制分类器的训练。假设我们的目标类别1代表了我们所拥有的所有训练数据的<1%,以及0级>99%。为了更好地惩罚这个模型对少数类的误判,我想在损失函数中使用权重。对于每个小批处理,我创建了相应的小批权重,其中我们的目标类获得一个权重标量>1.0,而我们的大多数类相应地<1.0。例如,在下面的代码中,我们对第1类使用2.0,对第2类使用0.6。

代码语言:javascript
复制
loss_sum = 0.0
for t, o, tw in zip(self._targets_uns, self._logits_uns, self._targets_weight_uns):
    # t -- targets tensor [batchsize x 1], tw -- weights tensor [batchsize x 1]
    # e.g. [0, 0, 0, 0, 1, 1, 0] -- [0.5, 0.5, 0.5, 0.5, 2.0, 2.0, 0.5]
    _loss = tf.losses.sigmoid_cross_entropy(t, o, weights=tw, label_smoothing=0,
                                scope="sigmoid_cross_entropy",
                                loss_collection=tf.GraphKeys.LOSSES)
    loss_sum += _loss

对模型进行训练后,对预测精度进行检验,发现预测精度略低于不带权值的精度。我继续实验,尝试重量对的[1.4, 0.8], [1.6, 0.4], [4.0, 0.1], [3.0, 1.0], ...等等。然而,我并没有得到任何改善,比未加权的训练,只有2-3%的轻微差异低。好吧,也许我误解了函数的docs。

权重作为损失的系数。如果提供了标量,则损失将按给定值进行缩放。如果权值是形状batch_size的张量,则损失权值适用于每个对应的样本。

我只需要反转成对,对0类使用更高的权重,对于第1类:[0.5, 2.0], [0.8, 1.3], [0.2, 1.0], ...使用更低的权重。这也没有提供任何改进,只是比未加权版本稍差一些。

有人能给我解释一下加权损失的行为吗?我做得对吗?我该怎么做才能增加少数群体的体重呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-13 15:09:07

加权是一种通用的数学技术,用于求解Wx=y形式的一个过度指定的方程组,其中x在输入向量中,y是输出向量,W是你想要找到的变换矩阵。通常情况下,这些问题都是通过SVD等技术来解决的。SVD将通过最小化过度指定的系统的W来找到least-squared error的解决方案.Tensorflow基本上是通过最小化过程来解决类似的问题。

在你的例子中,你有一个A类的样本和99个B类的样本,因为求解过程是为了最小化总体误差,所以B类对解的贡献是A类的99倍到A类的1倍。为了解决这个问题,你应该调整你的权重,以便A类和B类对解决方案有一个偶数的贡献。体重比B级低0.01。

更普遍地说你可以..。

代码语言:javascript
复制
ratio = num_B / (num_A + num_B)
weights = [ratio, 1.0 - ratio]
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53283056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档