问题描述:
【功能模块】
Mindspore 1.5
【操作步骤&问题现象】
1、对比学习中需要载入正例与负例,来源于不同的数据集 PosDataSet 以及 NegDataSet,并且 两者的样本量不一致,现使用分别对着两个数据集使用RandomSampler采样
使用 batch 分别将数据集处理为 PosBatchDataSet 以及 NegBatchDataSet
2、为了使用Model的多卡并行功能,现需要将两个数据集合并为同一个数据集, 当 原PosBatchDataSet 或者 NegBatchDataSet 的batchSize为 64 时 ,希望合并后的数据集的batchSize为 128,其中前 64 个数据来源于 PosBatchDataSet, 后64个 来源于NegBatchDataSet
3. 问题:
a. 合并数据集是否可行,若可行可否提供参考
b. 是否可以使用DistributedSampler使用多机
c. 由于PosDataSet 以及 NegDataSet样本量不一致, 是否可以指定NegDataSet 重复采样,直到 PosDataSet 非重复采样结束
【截图信息】
class MakeDataset:
def __init__(self, length):
self.length = length
self.A = [np.ones((2, 2)) for _ in range(length)]
self.B = np.arange(length)
def __getitem__(self, index):
return self.A[index], self.B[index]
def __len__(self):
return self.length
batch_size = 64
pos_data_set = MakeDataset(1000)
neg_data_set = MakeDataset(1000)
pos_data_set = GeneratorDataset(pos_data_set, column_names=["A", "B"])
neg_data_set = GeneratorDataset(neg_data_set, column_names=["A", "B"])
pos_batch_data_set = pos_data_set.batch(batch_size)
neg_batch_data_set = neg_data_set.batch(batch_size)
# Merge(pos_batch_data_set, neg_batch_data_set)
解答:
建议把 NegBatchData 和 PosBatchData 放到同一个 MakeDataset里面,然后自己控制 NegSample -> NegBatch 和 PosSample -> PosBatch的逻辑,以及重复采样也可以在 __getitem__里面控制实现。即:通过MakeDataset 输出的就是已经混合好的 Batch。 按照上面的逻辑,只有一个MakeDataset,是可以使用 DistributedSampler的。