Как создать разделение для обучения, тестирования и проверки в tensorflow 2.0

Я новичок в тензорном потоке, и я начал использовать тензорный поток 2.0

Я создал набор данных тензорного потока для задачи классификации нескольких классов. Назовем это labeled_ds. Я подготовил этот набор данных, загрузив все файлы изображений из соответствующих классовых каталогов. Я следил за руководством здесь: руководство по тензорному потоку для загрузки набора данных изображений

Теперь мне нужно разделить labeld_ds на три отдельные части: обучение, проверка и тестирование. Я просматривал API тензорного потока, но не было примера, который позволял бы указать проценты разделения. Я нашел кое-что в методе загрузки, но не знаю, как использовать это. Кроме того, как я могу получить разбиения для расслоения?

# labeled_ds contains multi class data, which is unbalanced.
train_ds, val_ds, test_ds = tf.data.Dataset.tfds.load(labeled_ds, split=["train", "validation", "test"])

Я застрял здесь, был бы признателен за любой совет о том, как двигаться дальше. Заранее спасибо.


person Swaroop    schedule 15.10.2019    source источник
comment
Обратитесь к этому ответу, чтобы разделить tf.data набор данных   -  person Swapnil Masurekar    schedule 01.12.2019
comment
@SWAPNILMASUREKAR решение, предоставленное для там, будет работать для разделения данных на несколько подмножеств. Проблема в том, что полученные разбиения по-прежнему не будут расслоены.   -  person Swaroop    schedule 06.02.2020
comment
Я столкнулся с той же проблемой и, похоже, не нашел решения в тензорном потоке, которое гарантирует, что набор данных действительно стратифицирован. В итоге я выбрал решение this. Это функция, которая разделяет ваш набор данных на подкаталоги train и validation - затем вы можете создавать наборы данных tenorflow для обучения и проверки из каждого каталога.   -  person ofir dubi    schedule 29.09.2020
comment
@ofirdubi спасибо, что поделились ссылкой на код. Я тоже сделал нечто подобное, поскольку TensorFlow не предоставляет такую ​​функциональность из коробки.   -  person Swaroop    schedule 29.09.2020


Ответы (3)


Пожалуйста, обратитесь к приведенному ниже коду, чтобы создать разделение поездов, тестов и проверок с использованием набора данных тензорного потока "oxford_flowers102"

!pip install tensorflow==2.0.0

import tensorflow as tf
print(tf.__version__)
import tensorflow_datasets as tfds

labeled_ds, summary = tfds.load('oxford_flowers102', split='train+test+validation', with_info=True)

labeled_all_length = [i for i,_ in enumerate(labeled_ds)][-1] + 1

train_size = int(0.8 * labeled_all_length)
val_test_size = int(0.1 * labeled_all_length)

df_train = labeled_ds.take(train_size)
df_test = labeled_ds.skip(train_size)
df_val = df_test.skip(val_test_size)
df_test = df_test.take(val_test_size)

df_train_length = [i for i,_ in enumerate(df_train)][-1] + 1
df_val_length = [i for i,_ in enumerate(df_val)][-1] + 1
df_test_length = [i for i,_ in enumerate(df_test)][-1] + 1

print('Original: ', labeled_all_length)
print('Train: ', df_train_length)
print('Validation :', df_val_length)
print('Test :', df_test_length)
person bsquare    schedule 18.03.2020
comment
Решение выглядит неплохо, но этот метод выбора подмножеств обучения, тестирования и проверки не обеспечивает стратификации данных. Термин stratified означает наличие равной доли выборок из всех классов (во всех трех подмножествах). - person Swaroop; 19.03.2020

У меня была такая же проблема

Это зависит от набора данных, в большинстве из которых есть набор поездов и тестов. В этом случае вы можете сделать следующее (при разбиении 80-10-10):

splits, info = tfds.load('fashion_mnist', with_info=True, as_supervised=True,
split=['train+test[:80]','train+test[80:90]', 'train+test[90:]'],
data_dir=filePath)
person Francesco Boi    schedule 21.10.2020
comment
Спасибо, Франческо, я искал решение для пользовательского набора данных. Однако ваше решение поможет другим, использующим наборы данных, предоставленные TensorFlow. - person Swaroop; 16.05.2021

Мне нравится Francesco Boi Soultion.

splits, info = tfds.load('fashion_mnist', with_info=True, as_supervised=True, split=['train+test[:80]','train+test[80:90]', 'train+test[90:]'])

(train_examples, validation_examples, test_examples) = splits
person Hitesh Choudhary    schedule 15.05.2021