Keras:批次内有正负样品的三重损失

Der*_*erk 5 triplet keras

https://arxiv.org/pdf/1703.07737.pdf中所建议的那样,我尝试重构我的Keras代码以对三胞胎使用“批处理硬”采样。

“核心思想是通过对P个类别(人的身份)进行随机抽样,然后对每个类别(人)的K个图像进行随机抽样,从而形成一批PK图像。现在,对于批次中的每个样本a,我们在形成三元组以计算损失时,可以在批次中选择最硬的正样本和最硬的负样本,我们将其称为“硬批次”

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

但是,如何使这种方法适合“硬分批”方法?生成器对64个图像进行采样,为此应形成64个三元组。首先,需要向前通过以获取当前模型的64个嵌入。

    embedding_model = Model(inputs = input_image, outputs = embedding)
Run Code Online (Sandbox Code Playgroud)

但是随后必须从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])
Run Code Online (Sandbox Code Playgroud)

并且可以通过定义三元组损失函数来训练此Triplet_model。但是,Keras是否可以使用fit_generator和'Batch Hard'方法?还是如何从批处理中的其他样本获取对嵌入的访问?

编辑:使用keras.layers.Lambda,我可以定义一个自己的层,以输入(batch_size,height,width,3)和输出(batch_size,3,height,width,3)创建三元组,但是我还需要访问id的某个位置。这在图层内可能吗?