Keras:批次内正、负样本的三重态损失

Keras:批次内正、负样本的三重态损失,keras,triplet,Keras,Triplet,我尝试重构我的Keras代码,对三元组使用“批量硬”采样,如中所建议的 “核心思想是通过随机抽样p类来形成批次 (个人身份),然后随机抽取每个类别的K张图像 (人),从而产生一批PK图片。现在,对于每个 样品a在批次中,我们可以选择最硬的阳性和 形成三联体时,批次内最硬的阴性样本 用于计算损失,我们称之为“批量硬” 因此,目前我有一个Python生成器(用于Keras中的model.fit_生成器),它在CPU上生成批处理。然后实际的向前和向后通过模型可以在GPU上完成 然而,如何使其与“批量硬

我尝试重构我的Keras代码,对三元组使用“批量硬”采样,如中所建议的

“核心思想是通过随机抽样p类来形成批次 (个人身份),然后随机抽取每个类别的K张图像 (人),从而产生一批PK图片。现在,对于每个 样品a在批次中,我们可以选择最硬的阳性和 形成三联体时,批次内最硬的阴性样本 用于计算损失,我们称之为“批量硬”

因此,目前我有一个Python生成器(用于Keras中的model.fit_生成器),它在CPU上生成批处理。然后实际的向前和向后通过模型可以在GPU上完成

然而,如何使其与“批量硬”方法相适应?生成器对64个图像进行采样,其中应形成64个三元组。首先,需要向前传递以获得当前模型的64个嵌入

    embedding_model = Model(inputs = input_image, outputs = embedding)
但是,必须从64个嵌入中选择最硬的正片和最硬的负片,以形成三元组。然后可以计算损失

    anchor = Input(input_shape, name='anchor')
    positive = Input(input_shape, name='positive')
    negative = Input(input_shape, name='negative')

    f_anchor = embedding_model(anchor)
    f_pos = embedding_model(pos)
    f_neg = embedding_model(neg)

    triplet_model = Model(inputs = [anchor, positive, negative], outputs=[f_anchor, f_pos, f_neg])
这个三重态_模型可以通过定义一个三重态损失函数来训练。但是,Keras是否可以使用fit_生成器和“批量硬”方法?或者如何从批次中的其他样品中获取嵌入件


编辑:使用keras.layers.Lambda,我可以定义一个自己的层,创建带有输入(batch_大小,高度,宽度,3)和输出(batch_大小,3,高度,宽度,3)的三元组,但我还需要访问id的某处。这在图层中可能吗?

您能找到答案吗?你使用了什么资源?谢谢是的,因为在Keras的较新版本中没有y_true和y_pred必须相同大小的限制,所以您可以创建自己的自定义损失函数。然后我使用了为“批量硬”文件发布的Tensorflow代码如果您的代码是公开的,您介意共享该链接吗?如果能看到一些代码就太好了:)