如何在Keras中生成批次以进行对比学习以确保正对在一起?



我正在训练一个使用Keras实现的神经网络。我的模型使用对比学习来学习嵌入:(视频)具有相同标签的输入是正对,应该具有相似的嵌入,而负对应该具有不同的嵌入。

我想做的是确保批将正对分组在一起。也就是说,如果我有标签[0,0,0,0,1,1,1,2,2],我想要两批,一种方法是将标签分成一批标签[0,0,1,1,1]和一批标签[0,0,2,2]。第一批现在包含成对(0,0)(1,1)(在标签1的所有实例之间),而第二批包含成对(0,0)(2,2)

我认为这可以通过确保没有批处理只包含一次标签来实现。以上面的示例标签为例,我想尝试避免像[0,0,1,2,2]这样的批处理(其中标签1只在批处理中出现一次)。但是,我不知道如何实现批处理生成器来做这样的事情。任何帮助与实施这将是非常感谢。关于这个批处理生成策略的名称的提示也很受欢迎,因为我无法找到它是否有一个特定的名称。

我尝试使用Keras使用的标准批处理生成,但是我的模型没有学会使正嵌入相似。

您可以使用ds.group_by_window方法设置window_size==2,然后unbatchbatch为所需的batch_size。这将确保每个类的最新2个元素将在每个批处理中存在。

,

labels = np.random.randint(0, high=3, size=(20,))
features = ['feat_' + str(i) for i in np.arange(len(labels))]
#labels : [2, 2, 0, 1, ... 0, 1, 1, 2]
#features : ['feat_0','feat_1','feat_2',...'feat_19']

按窗口分组,使每个类按对分组,

window_size = 2
ds = ds.group_by_window(     
# Use label as key     
key_func=lambda _, l: l,          
reduce_func=lambda _, window: window.batch(window_size),     
window_size=window_size)

现在unbatch,然后batch基于batch_size:

#unbatch and batch based on batch_size
batch_size = 8
ds = ds.unbatch().batch(batch_size)

检查输出,

for x, y in ds.take(1):
print(x.numpy(), y.numpy())
#[b'feat_0' b'feat_1' b'feat_2' b'feat_5' b'feat_3' 
b'feat_6' b'feat_4'b'feat_7'] [2 2 0 0 1 1 2 2]

相关内容

  • 没有找到相关文章

最新更新