class_weights 或加权损失在哪里惩罚网络?

Posted

技术标签:

【中文标题】class_weights 或加权损失在哪里惩罚网络?【英文标题】:where does class_weights or weighted loss penalize the network? 【发布时间】:2021-04-01 16:04:01 【问题描述】:

我正在从事一个语义分割项目,我必须处理高度不平衡的多类数据。我在训练期间使用model.fit 参数搜索优化它,并在其中使用class_weightssample_weights

我可以使用 class_weight 字典实现以下功能

 0:1, 1:10,2:15 

我还在loss function中看到了一种更新权重的方法

但是这些权重会在什么时候更新?

    如果使用 class_weights 会在哪里受到惩罚?我已经为每一层有一个kernel_regularizer,所以如果我的班级必须根据我的班级权重受到惩罚,那么它将惩罚每一层的输出 y=Wx+b 还是仅在最后一层? 同样,如果我使用加权损失函数,它会仅在损失计算之前的最后一层或每层然后计算最终损失吗?

对此的任何解释都会非常有用。

【问题讨论】:

【参考方案1】:

您在字典中提到的class_weights 是为了说明您的数据不平衡。它们永远不会改变,它们只是为了增加对少数类的错误分类实例的惩罚(这样你的网络会更加关注它们,并且返回的梯度将一个“Class2”实例视为一个“Class2”实例的 15 倍重要) Class0' 实例)。

您提到的kernel_regularizer 驻留在您的损失函数中,并惩罚整个网络中权重矩阵的大权重规范(如果您在Dense 层中使用kernel_regularizer = tf.keras.regularizers.l1(0.01),它只会影响该层)。所以这是一个不同的权重,与类无关,只与网络中的权重有关。您最终的损失将类似于 loss = Cross_entropy + a * norm(Weight_matrix) ,这样网络将分配一个额外的任务来最小化分类损失(交叉熵),而权重范数仍然很低。

【讨论】:

谢谢。只是一个小的澄清,所以两者都只适用于网络分类权重的输出并且不对我的每一层权重做任何更改?这是正确的吗? kernel_regularizer 会影响您调用它的层的权重,因此它可能会影响例如第一层的权重。 (或者您可以对每一层使用内核正则化器)类权重与您的网络权重直接无关。随着训练的进行,它们只会间接影响网络权重,因此您更改的权重说明了某些类比其他类更重要的事实。所以再一次,类权重不是网络的权重。它们以间接方式(通过训练)影响网络的所有权重。 谢谢你,这正是我困惑的地方。

以上是关于class_weights 或加权损失在哪里惩罚网络?的主要内容,如果未能解决你的问题,请参考以下文章

[2] 样本不均衡问题及其解决办法

如何在 keras 中创建自定义损失函数? (自定义加权二元交叉熵)

什么是惩罚幅度和符号差异的良好损失函数

如何在神经 ODE 的损失函数中添加 L1 惩罚?

Keras:class_weight 实际上试图平衡啥?

自定义损失函数 Tensorflow / Keras 惩罚相对距离