在Keras中使用不平衡样本训练多标签分类器

时间:2018-11-26 01:01:30

标签: python keras neural-network classification multilabel-classification

我正在尝试训练一个包含样本的keras模型,假设x_i代表样本i,并预测多个独立标签{y_hat}_ij,使得{{1} },如果模型预测样本{y_hat}_ij = 1带有标签x_i,否则预测j

我反复遇到的问题是每个标签的样本数量在标签之间不均衡。特别是,这是每个标签有多少个样本的计数(当然,由于我们正在处理多标签分类,因此存在重复计数)。我的模特有23个标签。

0

但是,我不确定如何按尺寸对其进行加权。我看到了this问题,但它使用标签的一键编码,即假设每个样本中只有一个真实标签。它本质上是一个稀疏的分类问题。我也遇到了this问题,但我认为这个问题与某种程度上对类的按样本加权有关。公认的答案没有说明如何在训练样本之间计算权重。

到目前为止我尝试过的是: 我计算了每个标签相对于其出现次数与总样本的任意权重。 total: 6790 Counter({22: 4702, 0: 1749, 12: 130, 8: 43, 16: 39, 15: 30, 17: 24, 20: 17, 4: 13, 5: 13, 19: 9, 6: 7, 7: 6, 2: 4, 10: 4}) ,其中class_weight = dict((c,round((1/v)*total,1)) for c,v in class_occ.items())是上面显示的计数器。这就是我得到的:

class_occ

然后,在训练模型时,我将其提供为kwarg:

class_weights: {0: 3.9, 2: 1697.5, 4: 522.3, 5: 522.3, 6: 970.0, 7: 1131.7, 8: 157.9, 10: 1697.5, 12: 52.2, 15: 226.3, 16: 174.1, 17: 282.9, 19: 754.4, 20: 399.4, 22: 1.4}

但是,此后该模型并没有真正学习,并且精度仍保持在0.1左右的低位。为了提供一些背景信息,以下是我编译模型的方式:

model.fit(x=...., class_weight=class_weight)

这是训练的进行方式(蓝色是损失;所有层均可训练): model-fit-history

从另一个训练实例中得出(黄色是损失;初始层被冻结): enter image description here

我不确定出了什么问题-我什至正确地使用了课堂加权?如果没有类别权重,则该模型将始终预测主要类别,而准确性将是具有主要类别的样本比例的基线。但是看起来它现在比随机性还差。

以防万一,这是我的out = Dense(numclasses+1, activation='sigmoid', name='out')(dense_top) model = Model(inputs=[input], outputs=[out]) model.compile(optimizer="adam", loss="binary_crossentropy", metrics=["categorical_accuracy"]) 输出:

model.summary()

之所以使用不可训练参数,是因为我使用的是转移学习:第一层是来自另一个模型,该模型对一组相同的标签对相同的数据进行了二进制分类(“做一个样本{{ 1}}具有标签集A与标签集B中的任何标签?')。 以防万一,这是问题所在,我还在单独的实例中将可训练性设置为Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) (None, None, 128) 0 _________________________________________________________________ lstm_1 (LSTM) (None, 192) 246528 _________________________________________________________________ dense_1 (Dense) (None, 160) 30880 _________________________________________________________________ dense_2 (Dense) (None, 128) 20608 _________________________________________________________________ dense_3 (Dense) (None, 128) 16512 _________________________________________________________________ dense_4 (Dense) (None, 64) 8256 _________________________________________________________________ dense_top_1 (Dense) (None, 64) 4160 _________________________________________________________________ dropout_42 (Dropout) (None, 64) 0 _________________________________________________________________ dense_top_2 (Dense) (None, 64) 4160 _________________________________________________________________ dropout_43 (Dropout) (None, 64) 0 _________________________________________________________________ dense_top_3 (Dense) (None, 64) 4160 _________________________________________________________________ dropout_44 (Dropout) (None, 64) 0 _________________________________________________________________ dense_top_4 (Dense) (None, 64) 4160 _________________________________________________________________ dropout_45 (Dropout) (None, 64) 0 _________________________________________________________________ dense_top_5 (Dense) (None, 32) 2080 _________________________________________________________________ out (Dense) (None, 23) 759 ================================================================= Total params: 342,263 Trainable params: 19,479 Non-trainable params: 322,784 ,但这对训练和使模型正常工作没有帮助。

0 个答案:

没有答案