我正在训练一个使用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
,然后unbatch
和batch
为所需的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]