#python #pytorch
Вопрос:
У меня есть повторяющийся объект набора данных со всеми моими файлами данных. Как я могу разделить его на набор для обучения и проверки. Я видел несколько решений для пользовательских наборов данных, но iterable не поддерживает len()
оператор. torch.utils.random_sample()
и torch.utils.SubsetRandomSample()
не работай.
def __init__(self):
bla bla
def __iter__(self):
bla bla
yield batch
Комментарии:
1. Как бы вы разделили свой набор данных, если бы не знали его длину? Это невозможно, вы должны знать размер базовых данных, иначе вы просто не сможете их разделить.
2. Я открыт для других предложений, я должен использовать iterabledataset. Я хочу убедиться, что ничего не упустил. В противном случае я могу разделить выборки перед прохождением через набор данных и принять несовершенное соотношение, вызвав набор данных отдельно для двух наборов.
Ответ №1:
Технически вы можете просто установить соотношение целей и начать собирать предметы в два списка случайным образом, используя это соотношение. Результат не будет идеальным, но асимптотически он сохранит соотношение.
Примером является JavaScript, так как его можно запустить здесь:
{
let a = [],
b = [];
function addsample(x) {
if (Math.random() < 0.2) // aims for 20%-80% split
a.push(x);
else
b.push(x);
return {a, b};
}
}
for(let i=0;i<20;i )
console.log(JSON.stringify(addsample(i)));
Если вы запустите фрагмент пару раз, вы увидите, что выходные данные сильно различаются, но даже при таком небольшом размере выборки это вполне заметно, что обычно всегда есть подходящее разделение, где a
действительно есть около 1/4 размера b
. Иногда ему даже удается закончить ровно в 4:16, но много раз это будет что-то другое. И там тоже могут быть «неудачные» пробеги, когда a
элементов больше, чем b
в конце.