一个序列的多标签分类,怎么做?
Multilabel classification of a sequence, how to do it?
我对深度学习领域尤其是 Keras 还很陌生。这里有一个简单的classification问题,不知道怎么解决。我不明白的是class化的一般过程,比如将输入数据转换为张量、标签等
假设我们有三个 classes,1, 2, 3
。
有一系列 class 需要 class 化为其中一个 class。数据集例如
- 序列
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]]
现在我确实理解的一件事是对 class 进行单热编码。因为我们有3个class,所以每个1
都会变成[1, 0, 0]
,2
会变成[0, 1, 0]
,3
会变成[=24] =].转换上面的示例将得到 3 x 4 x 3 的数据集和 3 x 1 x 3 的标签。
我理解的另一件事是最后一层应该是softmax层。这样如果一个测试数据出来了(比如[1, 2, 3, 4]
),它会被softmaxed,然后计算这个序列属于class 1 or 2 or 3的概率。
我说得对吗?如果是这样,你能给我一个explanation/exampleclass化这些序列的过程吗?
提前谢谢你。
以下是您似乎要问的一些说明。
- 这一点令人困惑,所以我删除了它。
- 如果输入数据的形状为 (4),则输入张量的形状为 (batch_size, 4)。
- Softmax 是您预测(最后)层的正确激活
给出你想要的输出,因为你有一个 classification 问题
有多个 classes。这将产生形状的输出 (batch_size,
3).这些将是每个潜在 class 化的概率,所有 classes 的总和为一个。例如,如果 class 化为 class
0
,则单个预测可能类似于 [0.9714,0.01127,0.01733]
.
- 批量大小不是 hard-coded 网络,因此它在 model.summary() 中表示为
None
。例如。网络的 last-layer 输出形状可以写成 (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'))
希望对您有所帮助!
我对深度学习领域尤其是 Keras 还很陌生。这里有一个简单的classification问题,不知道怎么解决。我不明白的是class化的一般过程,比如将输入数据转换为张量、标签等
假设我们有三个 classes,1, 2, 3
。
有一系列 class 需要 class 化为其中一个 class。数据集例如
- 序列
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]]
现在我确实理解的一件事是对 class 进行单热编码。因为我们有3个class,所以每个1
都会变成[1, 0, 0]
,2
会变成[0, 1, 0]
,3
会变成[=24] =].转换上面的示例将得到 3 x 4 x 3 的数据集和 3 x 1 x 3 的标签。
我理解的另一件事是最后一层应该是softmax层。这样如果一个测试数据出来了(比如[1, 2, 3, 4]
),它会被softmaxed,然后计算这个序列属于class 1 or 2 or 3的概率。
我说得对吗?如果是这样,你能给我一个explanation/exampleclass化这些序列的过程吗?
提前谢谢你。
以下是您似乎要问的一些说明。
- 这一点令人困惑,所以我删除了它。
- 如果输入数据的形状为 (4),则输入张量的形状为 (batch_size, 4)。
- Softmax 是您预测(最后)层的正确激活
给出你想要的输出,因为你有一个 classification 问题
有多个 classes。这将产生形状的输出 (batch_size,
3).这些将是每个潜在 class 化的概率,所有 classes 的总和为一个。例如,如果 class 化为 class
0
,则单个预测可能类似于[0.9714,0.01127,0.01733]
. - 批量大小不是 hard-coded 网络,因此它在 model.summary() 中表示为
None
。例如。网络的 last-layer 输出形状可以写成(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'))
希望对您有所帮助!