Функция text_dataset_from_directory
Функция text_dataset_from_directory создает датасет
tf.data.Dataset из текстовых файлов, расположенных
в директории. Имена подпапок внутри директории используются
как метки классов. Первым параметром функция принимает путь
к директории с данными. Вторым параметром можно передать
размер батча. Третьим параметром задается размер валидационной
выборки. Также можно указать размер изображения, зерно
генератора случайных чисел и другие параметры.
Синтаксис
tf.keras.utils.text_dataset_from_directory(
directory,
labels='inferred',
label_mode='int',
class_names=None,
batch_size=32,
max_length=None,
shuffle=True,
seed=None,
validation_split=None,
subset=None
)
Пример
Давайте создадим тестовую директорию с двумя классами текстовых файлов и загрузим из нее датасет:
import tensorflow as tf
import os
# create sample directory structure
base_dir = '/tmp/text_data'
os.makedirs(os.path.join(base_dir, 'positive'), exist_ok=True)
os.makedirs(os.path.join(base_dir, 'negative'), exist_ok=True)
with open(os.path.join(base_dir, 'positive', 'a.txt'), 'w') as f:
f.write('abcde')
with open(os.path.join(base_dir, 'positive', 'b.txt'), 'w') as f:
f.write('model.keras')
with open(os.path.join(base_dir, 'negative', 'c.txt'), 'w') as f:
f.write('abcde')
with open(os.path.join(base_dir, 'negative', 'd.txt'), 'w') as f:
f.write('model.keras')
ds = tf.keras.utils.text_dataset_from_directory(
base_dir,
batch_size=2,
seed=0
)
for texts, labels in ds.take(1):
print(texts)
print(labels)
Результат выполнения кода:
Found 4 files belonging to 2 classes.
tf.Tensor([b'abcde' b'model.keras'], shape=(2,), dtype=string)
tf.Tensor([0 1], shape=(2,), dtype=int32)
Пример
Давайте разделим данные на обучающую и валидационную выборки
с помощью параметра validation_split:
import tensorflow as tf
import os
base_dir = '/tmp/text_data'
os.makedirs(os.path.join(base_dir, 'positive'), exist_ok=True)
os.makedirs(os.path.join(base_dir, 'negative'), exist_ok=True)
with open(os.path.join(base_dir, 'positive', 'a.txt'), 'w') as f:
f.write('abcde')
with open(os.path.join(base_dir, 'positive', 'b.txt'), 'w') as f:
f.write('model.keras')
with open(os.path.join(base_dir, 'negative', 'c.txt'), 'w') as f:
f.write('abcde')
with open(os.path.join(base_dir, 'negative', 'd.txt'), 'w') as f:
f.write('model.keras')
train_ds = tf.keras.utils.text_dataset_from_directory(
base_dir,
batch_size=2,
validation_split=0.5,
subset='training',
seed=0
)
val_ds = tf.keras.utils.text_dataset_from_directory(
base_dir,
batch_size=2,
validation_split=0.5,
subset='validation',
seed=0
)
print('Train batches:', len(train_ds))
print('Val batches:', len(val_ds))
Результат выполнения кода:
Found 4 files belonging to 2 classes.
Using 2 files for training.
Found 4 files belonging to 2 classes.
Using 2 files for validation.
Train batches: 1
Val batches: 1
Пример
Давайте ограничим длину текстов с помощью параметра
max_length и загрузим датасет:
import tensorflow as tf
import os
base_dir = '/tmp/text_data'
os.makedirs(os.path.join(base_dir, 'positive'), exist_ok=True)
os.makedirs(os.path.join(base_dir, 'negative'), exist_ok=True)
with open(os.path.join(base_dir, 'positive', 'a.txt'), 'w') as f:
f.write('abcde')
with open(os.path.join(base_dir, 'positive', 'b.txt'), 'w') as f:
f.write('model.keras')
with open(os.path.join(base_dir, 'negative', 'c.txt'), 'w') as f:
f.write('abcde')
with open(os.path.join(base_dir, 'negative', 'd.txt'), 'w') as f:
f.write('model.keras')
ds = tf.keras.utils.text_dataset_from_directory(
base_dir,
batch_size=2,
max_length=3,
seed=0
)
for texts, labels in ds.take(1):
print(texts)
Результат выполнения кода:
Found 4 files belonging to 2 classes.
tf.Tensor([b'abc' b'mod'], shape=(2,), dtype=string)
Смотрите также
-
функцию
pad_sequences,
которая дополняет последовательности до одинаковой длины -
функцию
to_number,
которая преобразует строки в числа -
функцию
unicode_split,
которая разбивает строки на подстроки Unicode -
функцию
reduce_join,
которая объединяет строки в одно целое