如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的某个位置。这在图层内可能吗?
| 归档时间: |
|
| 查看次数: |
1670 次 |
| 最近记录: |