5

正如https://arxiv.org/pdf/1703.07737.pdf中所建议的那样,我尝试重构我的 Keras 代码以对三元组使用“Batch Hard”采样。

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

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

但是,如何使其适合“Batch Hard”方法?生成器对 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])

而这个triplet_model可以通过定义一个triplet loss函数来训练。但是,Keras 是否可以使用 fit_generator 和“Batch Hard”方法?或者如何从批次中的其他样本中获取嵌入?

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

4

0 回答 0