В этой статье я расскажу о том, что такое конвейер данных, как использовать конвейер данных с Python, и покажу примеры создания конвейера данных с помощью TensorFlow.

Что такое конвейер данных?

При построении модели важно привести данные в соответствующий формат. Один из наиболее важных шагов в анализе данных - предварительная обработка данных. Предварительная обработка данных отнимает у специалистов по данным большую часть времени. Автоматизация этапов предварительной обработки данных упрощает анализ данных.

Конвейер данных - это последовательность шагов, которые принимают необработанные данные из разных источников и перемещают их в место назначения для загрузки, преобразования и анализа.

В этом блоге я собираюсь осветить следующие темы:

  • Как обрабатывать текстовые файлы с помощью конвейера данных.
  • Как работать с наборами данных изображений.
  • Как создать конвейер данных для данных в структуре массива NumPy.

Конвейер данных для текстовых наборов данных

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

main_directory/
....pos 
........pst1.txt 
........pst2.txt 
....neg 
........ngt1.txt 
........ngt2.txt

Вы можете создать конвейер для текстовых наборов данных, используя метод text_dataset_from_directory в TensorFlow. Этот метод вернет tf.data.Dataset, который дает пакет текстов из подкаталогов pos и neg.

Давайте подумаем о наборе данных Internet Movie Database (IMDB) и классифицируем обзоры фильмов на положительные и отрицательные. Этот набор данных, который очень часто используется для обучения анализу текста, состоит из 25 000 крайне полярных обзоров фильмов для обучения и 25 000 для тестирования.

Скачивание набора данных

Прежде всего, позвольте мне импортировать библиотеки.

import io
import os
import re
import shutil
import string
import tensorflow as tf

Теперь я собираюсь загрузить набор данных IMDb. Если вы хотите скачать напрямую, вы можете использовать метод get_file (). Метод get_file () загружает файл с URL-адреса, если он еще не находится в кеше. Для этого позвольте мне создать переменную с именем url.

url = "https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz"

а затем позвольте мне использовать метод get_file () следующим образом:

data = tf.keras.utils.get_file(
          "aclImdb_v1.tar.gz", 
          url,
          untar=True, 
          cache_dir='.', 
          cache_subdir='')

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

data_dir = os.path.join(os.path.dirname(data), 'aclImdb')

Давайте заглянем внутрь train_dir в каталоге data_dir.

train_dir = os.path.join(data_dir, 'train')
os.listdir(train_dir)

Как видите, есть один каталог с именем unsup. Мне не нужен неподтвержденный каталог. Позвольте мне удалить этот каталог.

unused_dir = os.path.join(train_dir, 'unsup')
shutil.rmtree(unused_dir)

Я собираюсь взглянуть на train_dir.

os.listdir(train_dir)

Как видите, unsup удаляется из каталога данных. Убедитесь, что в качестве меток используются только имена каталогов. Покажи мне содержание учебного каталога.

ls aclImdb\train

Как видите, существуют каталоги pos и neg.

Создание конвейера данных

Теперь, когда я собираюсь создать конвейер. Во-первых, позвольте мне создать несколько переменных:

batch_size = 1024
seed = 123

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

Теперь, когда я собираюсь использовать метод test_dataset_from_directory () для создания конвейера данных.

train_ds = tf.keras.preprocessing.text_dataset_from_directory(    
    'aclImdb/train', 
    batch_size = batch_size, 
    validation_split=0.2, 
    subset='training', 
    seed=seed)

Так что я легко создавал наборы данных поездов с помощью конвейера. Для точной настройки гиперпараметра я воспользуюсь набором данных проверки. Давайте создадим набор данных для проверки.

val_ds = tf.keras.preprocessing.text_dataset_from_directory( 
        'aclImdb/train', 
        batch_size=batch_size,   
        validation_split=0.2, 
        subset='validation', 
        seed=seed)

Изучение набора данных

Теперь, когда я собираюсь исследовать содержимое этих файлов. Давайте случайным образом выберем пять строк из первого пакета и распечатаем их.

import random
idx = random.sample(range(1, batch_size), 5)
for text_batch, label_batch in train_ds.take(1):
    for i in idx:
        print(label_batch[i].numpy(),      
              text_batch.numpy()[i])

Вот и все. В этом разделе я показал, как работать с текстовыми наборами данных с помощью конвейера. Как видите, предварительная обработка данных выполняется легко с помощью конвейера.

Конвейер данных для наборов данных изображений

Вы можете использовать конвейер для модели изображения, которая может агрегировать данные из файлов в распределенной файловой системе, применять случайные возмущения к каждому изображению и объединять случайно выбранные изображения в пакет для обучения.

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

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

Изучение набора данных

Разрешите импортировать библиотеки, которые буду использовать в этом разделе.

import tensorflow as tf
import tensorflow_hub as hub
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

Обратите внимание, что в наборе данных есть файл меток. Я собираюсь посмотреть его содержимое, используя библиотеку pandas.

traindf=pd.read_csv(
    'flower_photos/all_labels.csv',
    dtype=str)
# Take a look first five fows of the dataset
traindf.head()

Создание конвейера данных

Я собираюсь построить конвейер данных для подачи этих изображений в модель классификации изображений. Для построения модели я собираюсь использовать предварительно созданную модель ResNet в TensorFlow Hub.

Теперь, когда я собираюсь создать несколько гиперпараметров, которые будут использоваться позже. Обратите внимание, что модель ResNet ожидает, что изображения будут иметь размер в пикселях 224 * 224, и мне нужно определить размер пакета.

data_root = 'flower_photos/flowers'
IMAGE_SIZE = (224, 224)
TRAINING_DATA_DIR = str(data_root)
BATCH_SIZE = 32

Я собираюсь нормализовать набор данных и зарезервировать 20% изображений для проверки набора данных. Позвольте мне использовать словарную структуру.

datagen_kwargs = dict(
    rescale=1./255, 
    validation_split=.20)

Теперь позвольте мне создать новую переменную и передать ей datagen_kwargs.

dataflow_kwargs = dict(
    target_size=IMAGE_SIZE,
    batch_size=BATCH_SIZE, 
    interpolation="bilinear")

Вы можете передавать эти изображения в процесс обучения с помощью ImageDataGenerator. Для этого я собираюсь определить генератор и передать ему datagen_kwargs.

train_datagen =   tf.keras.preprocessing.image.ImageDataGenerator(
**datagen_kwargs)

Чтобы создать конвейер данных, я собираюсь использовать метод flow_from_dataframe ().

train_generator = train_datagen.flow_from_dataframe(
    dataframe=traindf, 
    directory=data_root, 
    x_col="file_name", 
    y_col="label", 
    subset="training", 
    seed=10, shuffle=True, 
    class_mode="categorical", 
    **dataflow_kwargs)

Проверка набора данных

Позвольте мне показать изображения в наборе данных.

image_batch, label_batch = next(iter(train_generator))
fig, axes = plt.subplots(8, 4, figsize=(20, 40))
axes = axes.flatten()
for img, lbl, ax in zip(image_batch, label_batch, axes):
    ax.imshow(img)
    label_ = np.argmax(lbl)
    label = idx_labels[label_]
    ax.set_title(label)
    ax.axis('off')
    plt.show()

Итак, конвейер приема данных готов к использованию. Обучим модель.

Обучение модели

Я собираюсь построить модель, используя модель ResNet.

model = tf.keras.Sequential([
    tf.keras.layers.InputLayer(
        input_shape=IMAGE_SIZE + (3,)),
    hub.KerasLayer( 
        "https://tfhub.dev/tensorflow/resnet_50/feature_vector/1", trainable=False),
    tf.keras.layers.Dense(
        5, activation='softmax', 
        name = 'custom_class')])
model.build([None, 224, 224, 3])

Составим модель.

model.compile(
    optimizer=tf.keras.optimizers.SGD(lr=0.005, momentum=0.9),       
    loss=tf.keras.losses.CategoricalCrossentropy(
        from_logits=True, label_smoothing=0.1), 
    metrics=['accuracy'])

Собираюсь обучить модель.

steps_per_epoch = train_generator.samples // train_generator.batch_size
validation_steps = valid_generator.samples // valid_generator.batch_size
model.fit(
    train_generator, 
    epochs=13, 
    steps_per_epoch=steps_per_epoch,   
    validation_data=valid_generator, 
    validation_steps=validation_steps)

Вот и все. Как видите, генератор тренировочного образа и генератор валидационного образа переданы в тренировочный процесс. И точность обучения, и точность проверки в порядке. В этом разделе я показал, как использовать конвейер приема данных для набора данных изображения.

Конвейер данных для наборов данных массивов NumPy

До сих пор вы видели, как использовать конвейер данных для наборов данных текста и изображений. В этом разделе я собираюсь показать, как создать конвейер данных для набора данных массива NumPy. Для этого я воспользуюсь методом from_tensor_slices.

Давайте воспользуемся набором данных Fashion MNIST, который состоит из 10 типов одежды в оттенках серого. Изображения представлены с использованием структуры NumPy вместо типичного формата изображения, такого как JPEG или PNG. Вы можете легко скачать с помощью tf.Keras API.

Загрузка набора данных

Прежде всего, позвольте мне импортировать библиотеки.

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

Давайте загрузим наборы данных с помощью функции load_data в API tf.keras.

fashion_mnist = tf.keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

Позвольте мне взглянуть на структуру наборов данных.

print(type(train_images), type(train_labels))

Как видите, структуры наборов данных представляют собой массивы NumPy. Теперь, когда я собираюсь взглянуть на формы наборов данных с помощью команды shape.

print(train_images.shape, train_labels.shape)

Изучение набора данных

Чтобы визуализировать массив NumPy как цветовую шкалу, я собираюсь использовать библиотеку matplotlib.

plt.figure()
plt.imshow(train_images[5])
plt.colorbar()
plt.grid(False)
plt.show()

Предварительная обработка наборов данных

Изображения состоят из значений пикселей от 0 до 255. Чтобы быстрее построить модель и повысить точность, я собираюсь нормализовать значения пикселей.

train_images = train_images/255

Я собираюсь построить конвейер потоковой передачи, используя метод from_tensor_slices.

train_dataset = tf.data.Dataset.from_tensor_slices(
        (train_images, train_labels))

Позвольте мне разделить этот набор данных на обучающий и проверочный наборы. Гиперпараметры точно настроены с проверочным набором данных, а модель построена на обучающем наборе данных.

SHUFFLE_BUFFER_SIZE = 10000
TRAIN_BATCH_SIZE = 50
VALIDATION_BATCH_SIZE = 10000
#Creating the data pipelines
validation_ds = train_dataset.shuffle( SHUFFLE_BUFFER_SIZE).take( VALIDATION_SAMPLE_SIZE).batch(VALIDATION_BATCH_SIZE)
train_ds = train_dataset.skip( VALIDATION_BATCH_SIZE).batch( TRAIN_BATCH_SIZE).repeat()

Построение модели

Наборы данных готовы для построения модели. Для обучения модели я буду использовать последовательную модель.

# Build the model
model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),    
    tf.keras.layers.Dense(30, activation='relu'),   
    tf.keras.layers.Dense(10)
# Compiling the model
model.compile(
    optimizer=tf.keras.optimizers.RMSprop(),   
    loss=tf.keras.losses.SparseCategoricalCrossentropy( from_logits=True), 
    metrics=['sparse_categorical_accuracy'])
#Trainging the model
model.fit(
    train_ds, 
    epochs=13, 
    steps_per_epoch=steps_per_epoch,    
    validation_data=validation_ds,   
    validation_steps=validation_steps)

Вот и все. Итак, train_ds и validation_ds были переданы в процесс обучения. В этом разделе я показал, как создать конвейер данных с использованием from_tensor_slices для набора данных, который состоит из массива NumPy.

Резюме

Вы можете легко построить модель, используя конвейер данных для наборов данных с текстом, изображениями и Numpy. С помощью Data Pipeline вы можете регулярно получать доступ к своим данным, где они хранятся, преобразовывать, обрабатывать в масштабе и эффективно передавать в модель.

Вы можете найти записную книжку, которую я использовал в этом сообщении в блоге, на нашей странице github. Вам могут быть интересны следующие статьи.







Не забудьте подписаться на нас в GitHub 🌱, Twitter 😎 , Kaggle 📚, LinkedIn 👍

Увидимся в следующем посте…

Ресурсы