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

时间:2020-12-22 23:56:28

标签: tensorflow keras neural-network loss-function semantic-segmentation

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

我可以使用 class_weight 字典实现以下内容

{ 0:1, 1:10,2:15 }

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

您提到的 kernel_regularizer 位于您的损失函数中,并惩罚整个网络中权重矩阵的大权重范数(如果您在 kernel_regularizer = tf.keras.regularizers.l1(0.01) 层中使用 Dense,它只会影响该层)。所以这是一个不同的权重,与类无关,只与网络内部的权重有关。您最终的损失将类似于 loss = Cross_entropy + a * norm(Weight_matrix),这样网络将作为附加任务分配给它,以在权重范数保持较低的情况下最小化分类损失(交叉熵)。