使用批次输出的Keras损失函数

时间:2020-04-16 12:09:26

标签: python keras loss-function

我正在尝试使用 keras 的两分支神经网络来学习图像和文本的联合嵌入表示形式。我的模型如下所示:model structure

这些是我的训练模型的当前输入和输出:

model = Model([txt_input,img_input], [encoded_txt, encoded_img])

我必须使用双向排名损失,这意味着对应的文本和图像的表示应比任何其他图像/文本彼此靠边距m。这是整个损失函数,

  • s:相似性函数
  • D:训练集
  • Yi +:给定图像xi的一组对应(正)文本描述(我的实验中只有一个正)
  • Yi-:给定图像xi的一组非对应(否定)描述
  • Xi +:给定文字描述yi的一组对应(正)图像(我的实验中只有一个正)
  • Xi-:给定文字描述yi的一组非对应(负)图像

Loss formula

问题是,为了计算该损失,例如,我不仅必须知道当前图像的输出和相应的文本表示形式,而且还必须计算它们与其他图像/文本表示形式的相似度。

具体来说,我的问题是: 在计算损失时,是否可以包括整个批次的输出,或者至少包括前n个样本的输出?

我看到如何执行此操作的唯一方法是创建具有某种状态的损失函数,该函数保留最后n个样本的表示形式,并使用它们来计算相似度。我认为这不是一个好的解决方案,并且想知道是否有更优雅的方法来实现此目的。我还正在研究其他框架,例如Pytorch,以检查它们是否支持诸如批量损失之类的东西。任何帮助将不胜感激。

谢谢!

PS:我实际上是在尝试重现本文的实验:

L。 Wang,Y。Li和S. Lazebnik,“学习深度保留结构的图像-文本嵌入”,在IEEE会议论文集 计算机视觉和模式识别,第5005-5013页,2016年。

图像也是从本文中提取的。

1 个答案:

答案 0 :(得分:1)

具体来说,我的问题是:在计算损失时,是否可以包括整个批次的输出,或者至少包括前n个样本的输出?

我认为您错误地表达了自己的疑问或想法有误。假设您在训练时将批次大小设置为8,损失函数将准确地获取整个批次,并且损失是按批次计算的。

检查喀拉拉邦损失的实施情况。

class LossFunctionWrapper(Loss):
    """Wraps a loss function in the `Loss` class.
    # Arguments
        fn: The loss function to wrap, with signature `fn(y_true, y_pred,
            **kwargs)`.
        reduction: (Optional) Type of loss reduction to apply to loss.
            Default value is `SUM_OVER_BATCH_SIZE`.
        name: (Optional) name for the loss.
        **kwargs: The keyword arguments that are passed on to `fn`.
    """

默认值为SUM_OVER_BATCH_SIZE

因此,您可以计算整个批次的损失。

此外,您可以使用三重态损失的概念,并在损失函数中生成带有标志的正样本和负样本,以简化计算。

最后,这是本文的张量流实现,可能会有所帮助:https://github.com/lwwang/Two_branch_network