我正在尝试做一个多标签分类问题,该问题具有无数数据集。 样本总数为1130个,在1130个样本中,第一类出现在913个中。第二班215次,第三班423次。
在模型架构中,我有3个输出节点,并且应用了S型激活。
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_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()
进行训练时的结果。
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
答案 0 :(得分:-1)
我会尝试使用标签powerset方法。
尝试根据标签和数据集将其设置为可能的组合总数,而不是3个输出节点。例如,对于具有3个不同类别的多标签分类,有7种可能的输出。
说,标签是A,B和C。将输出0映射到A,1映射到B,2映射到C,3映射到AB,4映射到AC,依此类推。
在训练和测试之前使用简单的转换函数,可以将该问题转换为多类单标签问题。