keras 中的多个输出类

数据挖掘 机器学习 神经网络 深度学习 喀拉斯 多类分类
2021-09-19 12:17:56

我正在尝试使用神经网络预测电影类型。我最初考虑使用 softmax 层作为我的输出层,但由于一部电影可以有多个流派标签,我的输出应该如何?

另外,我将如何格式化我的数据以使其与 Keras 一起使用?

3个回答

我将如何格式化我的数据以使其与 Keras 一起使用?

您在输出层中的训练标签应该是一个二进制向量,1 表示存在的类,0 表示不存在的类。例如,假设您有 3 类类型 - 喜剧、浪漫和恐怖。有很多方法可以做到这一点,Scikit-learn 有一种方法可以让它变得非常简单,我将在下面展示。

>>> from sklearn.preprocessing import MultiLabelBinarizer
>>> mlb = MultiLabelBinarizer()
>>> y = mlb.fit_transform([[0,2],[1]])
array([[1, 0, 1],
   [0, 1, 0]])

我最初考虑使用 softmax 层作为我的输出层,但由于一部电影可以有多个流派标签,我的输出应该如何?

这是我建议的一个简单的 Keras 示例。

>>> from keras.models import Sequential
>>> from keras.layers import Dense, Activation

>>> model = Sequential([
    Dense(32, input_dim=784),
    Activation('relu'),
    Dense(10),
    Activation('sigmoid'),
    ])
>>> model.compile(optimizer='rmsprop', loss='binary_crossentropy')
>>> model.fit(X_train, y_train)

请参阅以获取更多信息。我使用了 sigmoid,因为它更适合多标签分类。

如果您可以分别拥有多个标签,您可以对输出层的每个类使用 sigmoid 激活函数,并使用正常二元交叉熵的总和作为损失函数。您只需使用带有二进制数的向量作为目标,对于每个标签,如果它包含标签,则为 1,如果不包含标签,则为 0。

您有不互斥的类标签,这意味着作为每个样本的标签,您的数据不会采用单热编码格式。每个输出向量可能有多个。在这种情况下,您不应该使用 soft-max 作为输出层。您必须对Sigmoid最后一层中的每个神经元使用激活函数。假设您有十个标签,对于一部典型的电影,每个标签都可能被激活。因此,在最后一层使用具有十个Sigmoid激活函数的密集层。你可以在这里看到这可能对你有帮助。

作为一个侧面答案,您将要使用的每个成本函数都应该是分类的,因为您有不同的类别。我非常尊重其他答案,并感谢他/她的答案,但我想您应该使用分类成本函数,否则代码将无法工作,因为您的输出矩阵实际上是样本矩阵而不是样本向量.