我正在尝试使用 keras 的两分支神经网络来学习图像和文本的联合嵌入表示形式。我的模型如下所示:
这些是我的训练模型的当前输入和输出:
model = Model([txt_input,img_input], [encoded_txt, encoded_img])
我必须使用双向排名损失,这意味着对应的文本和图像的表示应比任何其他图像/文本彼此靠边距m。这是整个损失函数,
问题是,为了计算该损失,例如,我不仅必须知道当前图像的输出和相应的文本表示形式,而且还必须计算它们与其他图像/文本表示形式的相似度。
具体来说,我的问题是: 在计算损失时,是否可以包括整个批次的输出,或者至少包括前n个样本的输出?
我看到如何执行此操作的唯一方法是创建具有某种状态的损失函数,该函数保留最后n个样本的表示形式,并使用它们来计算相似度。我认为这不是一个好的解决方案,并且想知道是否有更优雅的方法来实现此目的。我还正在研究其他框架,例如Pytorch,以检查它们是否支持诸如批量损失之类的东西。任何帮助将不胜感激。
谢谢!
PS:我实际上是在尝试重现本文的实验:
L。 Wang,Y。Li和S. Lazebnik,“学习深度保留结构的图像-文本嵌入”,在IEEE会议论文集 计算机视觉和模式识别,第5005-5013页,2016年。
图像也是从本文中提取的。
答案 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