Keras:使用categorical_crossentropy而不使用一键编码的目标数组

时间:2018-11-01 19:04:15

标签: python keras

我有一个Keras模型,用于解决多类分类问题。我正在这样做:

model.compile(
    loss='categorical_crossentropy',
    optimizer='adam',
    metrics=['accuracy'],
)

我目前有〜100个功能,并且有〜2000个可能的类。一键编码该类会导致内存问题。

是否可以在此Keras模型中使用categorical_crossentropy,而 not 对类标签进行一次热编码。例如。而不是使目标看起来像这样:

[0, 0, 0, 1, 0, 0, ...]

那将是:

3

我在Keras中查看了categorical_crossentropy的来源,它假设两个相同形状的张量。有没有办法解决这个问题并使用我描述的方法?

谢谢!

2 个答案:

答案 0 :(得分:4)

如果目标是一键编码的,请使用categorical_crossentropy。 一键编码的示例:

[1,0,0]
[0,1,0]
[0,0,1]

但是,如果目标是整数,请使用sparse_categorical_crossentropy。 整数编码的示例:

1
2
3

答案 1 :(得分:1)

您能否发布其余代码?根据我的理解,当使用分类交叉熵作为损失函数时,最后一层应使用softmax激活函数,从而为每个输出神经元产生与所述神经元类别相对应的输入概率,而不是直接产生单热向量。然后将分类交叉熵计算为

enter image description here

其中p是这些概率。通过仅输出类,您将无法访问这些概率,因此将无法计算分类交叉熵。