代码之家  ›  专栏  ›  技术社区  ›  minerals

在Tensorflow中失重是如何工作的?

  •  0
  • minerals  · 技术社区  · 7 年前

    我在一个明显代表性不足的目标类上训练一个递归的二元分类器。假设我们的目标类1代表<我们所有培训数据的1%,0级>99%. 为了惩罚模型对少数阶级的错误预测,我想在损失函数中使用权重。对于每个minibatch,我创建了一个对应的minibatch权重,其中我们的目标类获得一个权重标量>1.0和我们的多数阶级<相应地为1.0。例如,在下面的代码中,我们将2.0用于类1,将0.6用于类2。

    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], ... tf.losses.sigmoid_cross_entropy 功能。

    重量作为损失的系数。如果提供了一个标量,那么损失只是按给定的值进行缩放。如果权重是形状张量[批量大小],则损失权重适用于每个相应的样本。

    我只是把这两对颠倒过来,对0级使用更高的权重,对1级使用更低的权重: [0.5, 2.0], [0.8, 1.3], [0.2, 1.0], ... . 这也没有提供任何改善,除了比未加权版本稍差。

    1 回复  |  直到 7 年前
        1
  •  3
  •   bivouac0    7 年前

    加权是一种通用的数学技术,用于求解形式为的超指定方程组 Wx=y 哪里 x y 是输出向量 W 是您希望找到的变换矩阵。通常情况下,这些问题是通过使用SVD等技术来解决的。SVD将为 通过最小化 least-squared error 对于过度指定的系统。张量流基本上是通过它的最小化过程来解决一个类似的问题。

    在你的例子中,发生的是你有1个A类样本和99个B类样本。因为求解过程的作用是使总体误差最小化,所以B类对解的贡献是a类的1的99倍。为了解决这个问题,您应该将权重调整为,以便a类和B类对解的贡献是均匀的,即。。B级重量降低0.01。

    一般来说你可以。。。

    ratio = num_B / (num_A + num_B)
    weights = [ratio, 1.0 - ratio]
    
    推荐文章