一个序列的多标签分类,怎么做?

Posted

技术标签:

【中文标题】一个序列的多标签分类,怎么做?【英文标题】:Multilabel classification of a sequence, how to do it? 【发布时间】:2019-10-08 21:43:07 【问题描述】:

我是深度学习领域的新手,尤其是 Keras。这里有一个简单的分类问题,不知道怎么解决。我不明白的是分类的一般过程如何,比如将输入数据转换为张量、标签等​​。

假设我们有三个类,1, 2, 3

有一系列类需要归类为这些类中的一个。数据集例如

序列1, 1, 1, 2 标记为2 序列2, 1, 3, 3 标记为1 序列3, 1, 2, 1 标记为3

等等。

这意味着输入数据集将是

[[1, 1, 1, 2],
 [2, 1, 3, 3],
 [3, 1, 2, 1]]

标签将是

[[2],
 [1],
 [3]]

现在我明白的一件事是对类进行一次热编码。因为我们有三个类,每个1 都将转换为[1, 0, 0]2 将转换为[0, 1, 0]3 将转换为[0, 0, 1]。转换上面的例子会得到一个 3 x 4 x 3 的数据集和一个 3 x 1 x 3 的标签。

我理解的另一件事是最后一层应该是 softmax 层。这样,如果像(例如[1, 2, 3, 4])这样的测试数据出来,它将被softmaxed并计算该序列属于1类或2类或3类的概率。

我说的对吗?如果是这样,你能给我一个解释/例子来说明这些序列的分类过程吗?

提前谢谢你。

【问题讨论】:

你的问题看起来很奇怪,好像你几乎知道输入谁和输出的表示。同时,您不想了解任何架构的工作原理。 @AshwinGeetD'Sa 对不起,让我编辑问题。也许你是对的,我几乎知道如何输入输入,但我想我也需要一个代码示例。实际上,我确实在 Keras 中尝试了一些示例,但到目前为止,我遇到了各种错误,例如张量大小不匹配等。因为理论上我实际上知道 LSTM 的工作原理,并且我看到了 LSTM 或图像分类的工作示例例如 CNN,但不是这种问题。 @AshwinGeetD'Sa 很好,我的意思是我不需要深入解释模型的工作原理,但如果有人愿意解释以帮助解决问题,我我当然很感激 您能否也发布您尝试过的代码以及您遇到的错误?以便您得到正确的解决方案。 @AshwinGeetD'Sa 很好,因为我编写的代码使用了一个非常具体的库,这就是为什么我没有将示例放在这里的原因,我也想知道一般的想法,而不是我的具体代码也有效 【参考方案1】:

以下是您似乎在询问的一些说明。

这一点令人困惑,因此我将其删除。 如果您的输入数据具有形状 (4),那么您的输入张量将具有形状 (batch_size, 4)。 Softmax 是预测(最后)层的正确激活 给定您想要的输出,因为您有分类问题 有多个类。这将产生形状的输出 (batch_size, 3)。这些将是每个潜在分类的概率,所有类别的总和为一个。例如,如果分类为 0 类,则单个预测可能类似于 [0.9714,0.01127,0.01733]。 批量大小没有硬编码到网络,因此它在 model.summary() 中表示为None。例如。网络的最后一层输出形状可以写成(None, 3)。 除非您有适用的替代方案,否则 softmax 预测层需要 categorical_crossentropy 损失函数。 网络的架构仍然由您决定,但您至少需要一个进出通道。在 Keras 中(正如您所标记的),有几种方法可以做到这一点。以下是一些示例:

Keras 顺序示例

model = Sequential()
model.add(InputLayer(input_shape=(4,))) # sequence of length four
model.add(Dense(3, activation='softmax')) # three possible classes

Keras 函数示例

input_tensor = Input(shape=(4,))
x = Dense(3, activation='softmax')(input_tensor)
model = Model(input_tensor, x)

在第一个功能层(顺序或功能)中包括输入张量形状的示例:

model = Sequential()
model.add(Dense(666, activation='relu', input_shape=(4,)))
model.add(Dense(3, activation='softmax'))

希望有帮助!

【讨论】:

感谢您的回答!您作为示例编写的softmax输出,这是我不使用one-hot编码时的输出?或者是否使用 one-hot 编码无关紧要?这意味着softmax的输出总是设置为标签的数量(即词汇的大小)? 正确! softmax的输出确实要设置为标签的数量。事实上,最好的做法是明确地将单位数量与标签数量联系起来。例如。 Dense(y_train.shape[1], activation='softmax') 如果你需要在一些y 列上使用one-hot 编码,那很好,只要知道它会改变y 中列的number,从而改变形状网络的输出。如您所见,让您的输出层引用列数的可变形状会使预测的形状自动调整!巡航控制。 :) 为了清楚起见,如果 y 的列 colors 的值 ['red', 'green', 'blue'],单热编码将生成一个新的数据帧,其列 [is_red, is_green, is_blue] 和值 @987654337 @。输出层中的单元数为 3(列数组的长度;标签数)。然后,来自该网络的预测将具有 (batch_size, 3) 形状,以及上面第三个要点中的输出。 非常感谢!好答案。如果有人还想提供其他解释,我会在几天内将此不标记为答案。 您好!只是想指出 this bundle,前几天我把它捡起来并深入到 Keras 特定的那一章,第一章让我想起了你,因为它用比我更好的语言涵盖了很多。

以上是关于一个序列的多标签分类,怎么做?的主要内容,如果未能解决你的问题,请参考以下文章

涉及数字范围作为标签的多标签分类

多标签文本分类《基于标签语义注意力的多标签文本分类》

多标签文本分类《基于标签语义注意力的多标签文本分类》

多标签分类及多输出分类

多标签文本分类《融合注意力与CorNet的多标签文本分类》

多标签文本分类《融合注意力与CorNet的多标签文本分类》