如何在 Keras 中实现多类多标签分类



假设我有一组输入输出,如下所示:

input1  : [0 1 1 1 0 ... 1]
output1 : [1 2 2 3 ... 3 3 1 2 2]
...

输入始终为0或 1,输出始终为1 或 2 或 3

如何在 keras 中创建适合这些输入输出的神经网络?

checkpoint_path = 'p-multilable.h5' 
checkpoint = keras.callbacks.ModelCheckpoint(filepath=checkpoint_path, mode='max', monitor='acc', verbose=0, save_best_only=True)
model = keras.models.Sequential([
keras.layers.Dense(1000,activation='relu', input_shape=X_train.shape[1:]),
keras.layers.Dense(300,),
keras.layers.Dense(300,),
keras.layers.Dense(53)]) 

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
model.fit(X_train, y_train, batch_size=100, epochs=1000, validation_data=(x_val, y_val), callbacks=[checkpoint])

我尝试将输出标准化为 00.5 1,但没有帮助。

我尝试了各种损失函数

我尝试定义自定义损失函数

我尝试了许多网络架构

在大多数情况下,它的 ACC 约为 0.09

理论上它只不过是二进制集合,应该不难,但我找不到正确的方法

对于最后一个分类图层,应将其softmax激活。此激活用于分类。不过,它可能需要您对输出进行一次热编码。

回答我自己的问题: 似乎有两种方法可以克服这个问题:

1-丑陋的方法:

每个数字使用两个输出,因此1将变为 01,2 变为 10,3 变为11对于00,您可以将其用于上述任何一项,甚至可以计算精度

2-不那么丑陋的方法:

对每个输出使用三个 One 热编码,因此1变为 001,2变为010,3 变为100

您也可以使用 2D [x][3]输入,以便获得 2D 输出 [y][3],但似乎没有必要

相关内容

  • 没有找到相关文章

最新更新