在 C# 中将数据集拆分为 train/test/valid
Dataset splitting as train/test/valid at C#
我有一个数据为 Dictionary<string,List<string>>
。 Key
个词典包括 class_name
,Value
个词典包括 个图像 。毕竟,我在我的本地电脑上生成了这个字典作为数据集。但是,我必须在 C# 代码中拆分 train(%80)
/test(%10)
/valid(%10)
中的所有数据。例如,我选择了 90 张图片,我有 3 张 class,每个 class 有 30 张图片。拆分后,Train set class 必须有24张图片,test and val sets 3张图片一张一张。我该怎么做,有人帮忙吗?我分享一个png帮助理解。enter image description here
我没有完全理解你的结构,但假设你的词典有 90 个词条
var train = new List<KeyValuePair<string,List<string>>>();
var test = new List<KeyValuePair<string,List<string>>>();
var valid = new List<KeyValuePair<string,List<string>>>();
int i = 0;
foreach(var kvp in dictionary90){
var x = i++ % 10;
if(x<8)
train.Add(kvp);
else if(x<9)
test.Add(kvp);
else
valid.Add(kvp);
}
它会将您的词典条目分散到列表中 8:1:1 的比例
这个函数会将你的字典分成3份。你可以通过改变循环条件来修改它。如果 List 的计数大于 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);
}
我有一个数据为 Dictionary<string,List<string>>
。 Key
个词典包括 class_name
,Value
个词典包括 个图像 。毕竟,我在我的本地电脑上生成了这个字典作为数据集。但是,我必须在 C# 代码中拆分 train(%80)
/test(%10)
/valid(%10)
中的所有数据。例如,我选择了 90 张图片,我有 3 张 class,每个 class 有 30 张图片。拆分后,Train set class 必须有24张图片,test and val sets 3张图片一张一张。我该怎么做,有人帮忙吗?我分享一个png帮助理解。enter image description here
我没有完全理解你的结构,但假设你的词典有 90 个词条
var train = new List<KeyValuePair<string,List<string>>>();
var test = new List<KeyValuePair<string,List<string>>>();
var valid = new List<KeyValuePair<string,List<string>>>();
int i = 0;
foreach(var kvp in dictionary90){
var x = i++ % 10;
if(x<8)
train.Add(kvp);
else if(x<9)
test.Add(kvp);
else
valid.Add(kvp);
}
它会将您的词典条目分散到列表中 8:1:1 的比例
这个函数会将你的字典分成3份。你可以通过改变循环条件来修改它。如果 List 的计数大于 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);
}