【问题标题】:keras - softmax top N - loss functionkeras - softmax top N - 损失函数
【发布时间】:2017-08-09 03:07:21
【问题描述】:

我在如何使用 keras 来适应我的场景时遇到了麻烦。在我的输出层中,它将输出每个项目的概率。我想取前 N 个项目(即概率最高),看看它们是否是事实的子集(有一组项目)。我必须为这种情况编译负对数可能性。请问我该怎么做呢?

非常感谢您提前提供的帮助。

`

nn = Sequential()
 nn.add(Dense(self.num_hidden_units, input_dim = input_num, init="uniform"))
 nn.add(Activation('tanh'))
 nn.add(Dense(self.num_items, init="uniform"))
 nn.add(Activation('softmax'))

`

【问题讨论】:

  • 是多标签,还是多类场景?换句话说,你们的标签是互斥的吗?
  • 输出是每个项目发生的概率,你可以说每个类。但它们并不相互排斥,正如我所提到的,我想在输出中取前 N 个,看看它们是否是真值集的子集。但我不确定在这种情况下如何应用负对数似然。我不能使用分类交叉熵,因为我不是从多类中预测一个类。感谢您的回复!

标签: machine-learning keras keras-layer


【解决方案1】:

如果我理解正确,您属于multi-label classification 制度。在这种情况下,常见的目标函数是二元交叉熵损失,高于sigmoid 的激活。

请注意,您应该将 softmax 激活替换为 sigmoid,因为在您的情况下,概率不必总和为 1

在 keras 中应用损失的使用示例:

model.compile(loss='binary_crossentropy', optimizer='sgd')

【讨论】:

  • 我认为二元交叉熵是用于二元分类的。那么当它是多标签分类时,我们也使用二元交叉熵吗?另外,为什么用 sigmoid 而不是 softmax?我的意思是这有什么不同吗?
  • 在多标签中,你喜欢预测一个类是否存在,因此是二进制的。由于多个类可以同时存在,因此需要使用 sigmoid 而不是 softmax,因为 softmax 适用于类互斥的情况。例如。如果图像有鸟和狗,理想的 sigmoid 分类器将导致 output_dog=1,output_bird=1,所有其他输出=0,而使用 softmax,您可以获得的最接近的是 output_dog=0.5,output_bird=0.5,所有其他输出=0
  • 哦....我完全明白你的意思。如果它们相互排斥怎么办?那么损失应该是什么? PS我实际上是在尝试实施这篇论文-ceur-ws.org/Vol-1441/recsys2015_poster15.pdf,将下一个篮子推荐作为一种实践,因为它的结构相当简单。但我只是不太明白我应该如何在 keras 中使用负对数似然
  • 如果它们是互斥的,那么你宁愿使用softmax输出激活,带有分类交叉熵损失
  • 但我的 y_true 类似于长度 = 项目总数的向量,如果该项目存在,则值为 1,否则为 0,因为我没有真实概率。如果我需要 softmax 来获得最高概率的项目,添加额外的处理是一个好主意,我选择概率最高的项目,它们在结果向量中将是 1,所以它可以与 y 真相相媲美?非常感谢,很抱歉所有后续问题
猜你喜欢
  • 2018-06-02
  • 2019-10-13
  • 2018-10-10
  • 2023-04-03
  • 2019-04-11
  • 1970-01-01
  • 2018-10-21
  • 2021-05-23
  • 2020-12-19
相关资源
最近更新 更多