我正在尝试训练一个包含样本的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)
我不确定出了什么问题-我什至正确地使用了课堂加权?如果没有类别权重,则该模型将始终预测主要类别,而准确性将是具有主要类别的样本比例的基线。但是看起来它现在比随机性还差。
以防万一,这是我的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
,但这对训练和使模型正常工作没有帮助。