Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有不平衡数据集的多标签分类_Python_Tensorflow_Keras_Neural Network_Multilabel Classification - Fatal编程技术网

Python 具有不平衡数据集的多标签分类

Python 具有不平衡数据集的多标签分类,python,tensorflow,keras,neural-network,multilabel-classification,Python,Tensorflow,Keras,Neural Network,Multilabel Classification,我正在尝试做一个多标签分类问题,它有一个imabalanced数据集。 样本总数为1130个,在1130个样本中,913个样本出现了第一类。第二节课215次,第三节课423次 在模型架构中,我有3个输出节点,并应用了sigmoid激活 input_tensor = Input(shape=(256, 256, 3)) base_model = VGG16(input_tensor=input_tensor,weights='imagenet',pooling=None, include_top=

我正在尝试做一个多标签分类问题,它有一个imabalanced数据集。 样本总数为1130个,在1130个样本中,913个样本出现了第一类。第二节课215次,第三节课423次

在模型架构中,我有3个输出节点,并应用了sigmoid激活

input_tensor = Input(shape=(256, 256, 3))
base_model = VGG16(input_tensor=input_tensor,weights='imagenet',pooling=None, include_top=False)

#base_model.summary()

x = base_model.output

x = GlobalAveragePooling2D()(x)

x = tf.math.reduce_max(x,axis=0,keepdims=True)

x = Dense(512,activation='relu')(x)

output_1 = Dense(3, activation='sigmoid')(x)

sagittal_model_abn = Model(inputs=base_model.input, outputs=output_1)

for layer in base_model.layers:
    layer.trainable = True
我使用的是二进制交叉熵损失,我用这个函数来计算。 我用加权损失来处理这种不平衡

        if y_true[0]==1:
            loss_abn = -1*K.log(y_pred[0][0])*cwb[0][1]
        elif y_true[0]==0:
            loss_abn = -1*K.log(1-y_pred[0][0])*cwb[0][0]
        if y_true[1]==1:
            loss_acl = -1*K.log(y_pred[0][1])*cwb[1][1]
        elif y_true[1]==0:
            loss_acl = -1*K.log(1-y_pred[0][1])*cwb[1][0]
        if y_true[2]==1:
            loss_men = -1*K.log(y_pred[0][2])*cwb[2][1]
        elif y_true[2]==0:
            loss_men = -1*K.log(1-y_pred[0][2])*cwb[2][0]

        loss_value_ds = loss_abn + loss_acl + loss_men
cwb
包含类权重

y_true
是长度为3的基本事实标签

y_pred
是一个具有形状(1,3)的numpy数组

我将课程的发生和未发生分别加权

例如,如果标签为1,则将其计为一个引用,如果为0,则为非引用

因此,第一个类的标签1在1130次中出现913次

因此,第一类标签1的等级重量为1130/913,约为1.23,第一类标签0的等级重量为1130/(1130-913)

当我训练模型时,精度会振荡(或几乎保持不变),损失也会减少

我对每个样本都有这样的预测

[[0.51018655 0.5010625 0.50482965]

在所有类的每次迭代中,预测值在0.49-0.51范围内

尝试更改FC层中的节点数,但其行为方式仍然相同

有人能帮忙吗

使用
tf.math,reduce_max
会导致问题吗?使用
@tf.function
执行我正在使用
tf.math.reduce\u max
执行的操作是否有益

注意

我分别为每个类的标签1和0加权

cwb = {0: {0: 5.207373271889401, 1: 1.2376779846659365}, 
       1: {0: 1.2255965292841648, 1: 5.4326923076923075}, 
       2: {0: 1.5416098226466575, 1: 2.8463476070528966}}
编辑

使用
model.fit()进行训练时的结果


我会尝试使用label powerset方法

请尝试根据标签和数据集将其设置为可能的组合总数,而不是3个输出节点。例如,对于具有3个不同类的多标签分类,有7种可能的输出

比如,标签是A、B和C。将输出0映射到A、1映射到B、2映射到C、3映射到AB、4映射到AC等等


在培训和测试之前使用一个简单的转换函数,可以将此问题转换为多类、单标签问题。

我认为您不应该对不同的类进行加权。您应该为每个类设置标签0和1的权重。例如:对于第一个类,0的标签应为1130/913,1的标签应为1130/217(217=1130-917)。对于第二类:标签1的重量是1130/215,等等。@federicober我就是这么做的。我用1130/217为第一个类的标签0加权,用1130/913为标签1加权,因为标签1出现913次,0出现217次。你用过3个单独的分类器吗?@federicober我会在几个小时内告诉你。@federicober输出仍然是这样的
[[0.49103534][[0.48069718][[0.50579894]
。输出接近0.5,这意味着sigmoid的输入几乎为零。权重不是零,我检查过了。数据集是一个不平衡的多标签数据集。对一个类进行过采样也可能对与其相关的其他类进行过采样。您提供的链接是针对多类分类问题的
Epoch 1/20
1130/1130 [==============================] - 1383s 1s/step - loss: 4.1638 - binary_accuracy: 0.4558 - val_loss: 5.0439 - val_binary_accuracy: 0.3944
Epoch 2/20
1130/1130 [==============================] - 1397s 1s/step - loss: 4.1608 - binary_accuracy: 0.4165 - val_loss: 5.0526 - val_binary_accuracy: 0.5194
Epoch 3/20
1130/1130 [==============================] - 1402s 1s/step - loss: 4.1608 - binary_accuracy: 0.4814 - val_loss: 5.1469 - val_binary_accuracy: 0.6361
Epoch 4/20
1130/1130 [==============================] - 1407s 1s/step - loss: 4.1722 - binary_accuracy: 0.4472 - val_loss: 5.0501 - val_binary_accuracy: 0.5583
Epoch 5/20
1130/1130 [==============================] - 1397s 1s/step - loss: 4.1591 - binary_accuracy: 0.4991 - val_loss: 5.0521 - val_binary_accuracy: 0.6028
Epoch 6/20
1130/1130 [==============================] - 1375s 1s/step - loss: 4.1596 - binary_accuracy: 0.5431 - val_loss: 5.0515 - val_binary_accuracy: 0.5917
Epoch 7/20
1130/1130 [==============================] - 1370s 1s/step - loss: 4.1595 - binary_accuracy: 0.4962 - val_loss: 5.0526 - val_binary_accuracy: 0.6000
Epoch 8/20
1130/1130 [==============================] - 1387s 1s/step - loss: 4.1591 - binary_accuracy: 0.5316 - val_loss: 5.0523 - val_binary_accuracy: 0.6028
Epoch 9/20
1130/1130 [==============================] - 1391s 1s/step - loss: 4.1590 - binary_accuracy: 0.4909 - val_loss: 5.0521 - val_binary_accuracy: 0.6028
Epoch 10/20
1130/1130 [==============================] - 1400s 1s/step - loss: 4.1590 - binary_accuracy: 0.5369 - val_loss: 5.0519 - val_binary_accuracy: 0.6028
Epoch 11/20
1130/1130 [==============================] - 1397s 1s/step - loss: 4.1590 - binary_accuracy: 0.4808 - val_loss: 5.0519 - val_binary_accuracy: 0.6028
Epoch 12/20
1130/1130 [==============================] - 1394s 1s/step - loss: 4.1590 - binary_accuracy: 0.5469 - val_loss: 5.0522 - val_binary_accuracy: 0.6028