【问题标题】:Keras Loss function using outputs of batch使用批量输出的 Keras 损失函数
【发布时间】:2020-07-29 16:07:52
【问题描述】:

我正在尝试使用 keras 的双分支神经网络来学习图像和文本的联合嵌入表示。这是我的模型的样子:

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

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

我必须使用双向排名损失,这意味着相应文本和图像的表示应该比任何其他图像/文本更接近一个边距 m。这是整个损失函数,有

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

问题在于,为了计算这个损失,我不仅需要知道当前图像的输出和相应的文本表示,还必须计算它们与其他图像/文本表示的相似度。

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

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

谢谢!

PS:我其实是在尝试重现这篇论文的实验:

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

图片也是从这篇论文中提取出来的。

【问题讨论】:

    标签: python keras loss-function


    【解决方案1】:

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

    我认为您的问题措辞有误或有错误的想法。比方说,你在训练时设置了 batch size = 8,你的损失函数得到了整个批,损失是在批上计算的。

    检查 keras loss 的实现。

    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

    所以,你可以计算整个批次的损失。

    另外,可以利用triplet loss的概念,在损失函数中生成带有flag的正负样本,方便计算。

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

    【讨论】:

      猜你喜欢
      • 2021-07-23
      • 2019-06-24
      • 2019-06-23
      • 2018-07-13
      • 2021-02-16
      • 2021-05-23
      • 2019-01-13
      • 2020-10-07
      • 1970-01-01
      相关资源
      最近更新 更多