我有一个数据,格式为Dictionary<string,List<string>>
。字典的Key
包含class_name
,字典的Value
包含图片。最终,我在本地电脑上生成了这个字典作为数据集。然而,我必须在C#代码中将所有数据按照train(%80)
/test(%10)
/valid(%10)
的比例进行拆分。例如,我选择了90张图片,并且有3个类,每个类有30张图片。拆分后,训练集的每个类必须包含24张图片,测试集和验证集各包含3张图片。请问如何实现这一点?有谁能帮我吗?我分享了一张png图片以帮助理解。输入图片描述
回答:
这个函数将把你的字典拆分为3部分。你可以通过更改循环条件来修改它。如果列表的计数大于1(因为使用了Math.Ceiling函数),它将正常工作。
(Dictionary<string, List<string>> trainData, Dictionary<string, List<string>> testData, Dictionary<string, List<string>> validData) SplitData(Dictionary<string, List<string>> data){ var random = new Random(); var train = new Dictionary<string, List<string>>(); var test = new Dictionary<string, List<string>>(); var valid = new Dictionary<string, List<string>>(); foreach (KeyValuePair<string, List<string>> dataClass in data) { train[dataClass.Key] = dataClass.Value.ToList(); test[dataClass.Key] = new List<string>(); valid[dataClass.Key] = new List<string>(); for (int i = 0; i < Math.Ceiling(0.1 * dataClass.Value.Count); i++) { int idx = random.Next(train[dataClass.Key].Count); test[dataClass.Key].Add(train[dataClass.Key][idx]); train[dataClass.Key].RemoveAt(idx); } for (int i = 0; i < Math.Ceiling(0.1 * dataClass.Value.Count); i++) { int idx = random.Next(train[dataClass.Key].Count); valid[dataClass.Key].Add(train[dataClass.Key][idx]); train[dataClass.Key].RemoveAt(idx); } } return (train, test, valid);}