Демистификация документации TensorFlow для Tf.Data

Заявление об ограничении ответственности: прежде чем вы начнете читать, это не совсем курс для пустышек. Вам потребуется базовое понимание машинного обучения (которое вы можете получить здесь) и осознание того, что документация TensorFlow излишне сложна (что вы можете понять здесь).

Это руководство по Tf.Data 2.0

Не поймите меня неправильно! TensorFlow - прекрасная библиотека. Чаще всего специалисты по данным обращаются к нему в большей части своей деятельности по моделированию. Уникальным преимуществом этой библиотеки является то, как она легко интегрируется с любой платформой машинного обучения независимо от инфраструктуры. Теперь я могу попытаться влюбить тебя в это, но ты здесь не для этого!

Tensorflow огромен и ошеломляет, и каждый может погрузиться в него. Эта статья была бы моей попыткой помочь вам разобраться в этой библиотеке, в частности в API данных TensorFlow. Итак, приступим!

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

API данных TensorFlow берет кусок данных, обрабатывает его и передает на следующий этап рабочего процесса. Обработка обычно называется преобразованием.

В целом API данных TensorFlow можно разделить на три основных компонента:

  1. Извлечение данных: процесс переноса данных из внешнего местоположения / предыдущего шага рабочего процесса в память.
  2. Преобразование данных: это бизнес-логика, если можно, в которой обрабатываются введенные данные.
  3. Загрузка данных: этот шаг обеспечивает отправку преобразованных данных на следующий шаг рабочего процесса / места вывода преобразованных данных.

Заявление об ограничении ответственности: вы можете пропустить следующий абзац и прилагаемую к нему диаграмму для упрощения понимания API.

Прежде чем мы перейдем к этим двум компонентам, давайте быстро рассмотрим структуру набора данных. Набор данных является основой всего API Tf.data. Он берет данные из внешних источников и создает ссылки в виде графиков, которые анализируются с помощью абстрактных подклассов TensorFlow. Каждый набор данных при повторении вызывает парсеры и переносит данные в память.

Извлечение данных

Перед обработкой данные должны быть перемещены порциями из источника в память. При этом мы также должны осознавать тот факт, что процесс обработки должен быть согласованным для каждого фрагмента данных. Чтобы это произошло, создается input_function, который обрабатывает каждый фрагмент с одним и тем же набором операций.

Извлечение данных занимается чтением данных и созданием объекта набора данных. Это можно сделать шестью способами:

  1. Использование массивов NumPy

Если все ваши входные данные умещаются в памяти, самый простой способ создать из них Dataset - преобразовать их в объекты tf.Tensor и использовать Dataset.from_tensor_slices().

2. Использование файлов CSV.

Формат файла CSV - популярный формат для хранения табличных данных в виде простого текста. Следовательно, у Tf.Data есть плагин для того же самого.

3. Использование генераторов Python

Если ваши данные обслуживаются функцией Python (скажем, парсером Python), tf.data API может легко подобрать и проанализировать его.

4. Из данных TFRecord

Это редкий и сложный сценарий, но некоторые рабочие процессы используют формат TFRecord, и о нем полезно знать.

API tf.data поддерживает множество форматов файлов, поэтому вы можете обрабатывать большие наборы данных, не помещающиеся в памяти. Например, формат файла TFRecord - это простой двоичный формат, ориентированный на записи, который многие приложения TensorFlow используют для обучающих данных. Класс tf.data.TFRecordDataset позволяет вам передавать содержимое одного или нескольких файлов TFRecord как часть входного конвейера.

5. Использование текстовых данных

Многие наборы данных распространяются в виде одного или нескольких текстовых файлов (большинство случаев использования обработки естественного языка). tf.data.TextLineDataset предоставляет простой способ извлекать строки из одного или нескольких текстовых файлов. Учитывая одно или несколько имен файлов, TextLineDataset будет создавать по одному элементу со строковым значением в каждой строке этих файлов.

6. Использование наборов файлов, развернутых в сегменте GCS или S3.

Существует множество наборов данных, распространенных в виде наборов файлов, каждый из которых является примером.

Преобразование данных

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

1. Перемешивание

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

2. Повторить

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

Повторение - это обработка многократного повторения всего набора данных.

3. Пакетирование

Пакетная обработка - это процесс внесения набора элементов в память для применения функции преобразования. В случае данных изображения это может быть добавление некоторых ячеек для заполнения. Простейшая форма пакетной обработки объединяет n последовательных элементов набора данных в один элемент. Преобразование Dataset.batch() делает именно это с теми же ограничениями, что и оператор tf.stack(), применяемым к каждому компоненту элементов: то есть для каждого компонента i все элементы должны иметь тензор точно такой же формы. .

4. Карта

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

dataset = dataset.map(lambda record : replace_nulls(record)) #custom function to handle NULL values

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

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

Большое спасибо за чтение!

Дайте мне знать, как вам понравилась статья. Я планирую демистифицировать больше модулей библиотеки TensorFlow. Настройтесь на них!