[Tensorflow] Подробное объяснение формата файла TFRecord

TensorFlow
[Tensorflow] Подробное объяснение формата файла TFRecord

Если вы новичок в Tensorflow, то вы более или менее видели тень TFRecord на чужих блогах в Интернете, но многие авторы не очень подробно объяснили это, что может вас огорчить. Эта статья объясняет это в соответствии с моими собственными идеями, возможно, это может вам помочь.

Что такое TFRecord?

TFRecord — это двоичный формат файла, рекомендованный Google, который теоретически может сохранять информацию в любом формате.

Но нам, обычным разработчикам, нам не нужно заботиться об этом, Tensorflow предоставляет богатый API, который помогает нам легко читать и записывать файлы TFRecord.

Основное содержание TFRecord состоит в том, что внутри есть ряд примеров, а пример — это тело сообщения в протоколе protocolbuf.

Тут я считаю, что все хорошо разбираются в protocolbuf.Если вы не разбираетесь, то не беда.Он мало чем отличается от xml и json по сути.

В Интернете есть много примеров простых инструкций.

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

Тело сообщения примера содержит ряд атрибутов функции.

Каждая функция представляет собой карту, представляющую собой пару ключ-значение.

Значение ключа имеет тип String.

А value — это тело сообщения типа Feature, и оно имеет три значения:

  • BytesList

  • FloatList

  • Int64List

Следует отметить, что все они представлены в виде списков.

Protocolbuf — это формат протокола общего назначения, применимый ко всем основным языкам программирования. Таким образом, эти списки соответствуют спискам в языке python, а для Java или C/C++ они являются массивами.

Например, BytesList может хранить массив байтов, поэтому внутри могут поместиться такие вещи, как строки, изображения, видео и т. д.

Таким образом, TFRecord может хранить информацию практически в любом формате.

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

Зачем использовать TFRecord?

TFRecord не является обязательным, но это действительно официально рекомендуемый формат файлов Google.

1. Он особенно подходит для Tensorflow или создан специально для Tensorflow. 2. Поскольку разработчиков Tensorflow много, очень важно унифицировать формат файла данных во время обучения. Это также помогает снизить затраты на обучение и затраты на миграцию.

Как использовать TFRecord?

TFRecord — это формат файла, так что же делать с вводом-выводом файлов TFRecord?

Фактически, Tensorflow предоставляет нам богатые API, которые разработчики могут использовать для простой обработки файлов TFRecord.

Создать файл TFRecord

мы можем использоватьTFWriterВыполните это задание легко.

Но прежде чем мы это сделаем, мы должны сначала уточнить нашу цель.

Нам нужно выяснить, какую информацию хранить в файле TFRecord, который на самом деле является наиболее важным.

Ниже приведен пример.

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

Сначала определите тело сообщения примера.

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

Соответствует трем функциям имени, формы и данных соответственно.

Далее приступаем к реализации в коде.

Запустите приведенный выше код, чтобы сгенерировать файл cat.tfrecord в текущем каталоге.

Приведенные выше комментарии к коду более подробные, я сосредоточусь на них.

  1. Расшифруйте картинку, затем преобразуйте ее в строковые данные, а затем заполните.

  2. Значение Feature — это список, поэтому не забудьте добавить []

  3. В примере необходимо вызвать SerializetoString() для сериализации.

Чтение файлов TFRecord

Предыдущий раздел посвящен тому, как записать информацию об изображении в файл tfrecord.

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

Код относительно прост, к тому же я дал подробные комментарии, выделив несколько важных моментов для объяснения.

  1. Я использую набор данных для чтения файла tfrecord

  2. При разборе примера просто используйте готовый API tf.parse_single_example

  3. Используйте метод np.fromstring() для получения проанализированных строковых данных, не забудьте восстановить формат данных до np.uint8.

  4. Используйте метод tf.image.encode_jpeg() для кодирования данных изображения в формат jpeg.

  5. Данные изображения можно сохранить локально с помощью объекта tf.gfile.GFile.

  6. Поскольку форма изображения прописана в примере, при разборе необходимо указать размер, здесь [3] , иначе программа сообщит об ошибке.

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

И данные изображения в TFRecord также успешно сохраняются локально.

некоторые сомнения


В: Почему в моем примере в большинстве сообщений блога используется Dataset вместо QueueRunner?

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


В: После изучения знаний, связанных с TFRecord, что мне следует изучить дальше? О: Вы можете попробовать преобразовать распространенные наборы данных, такие как MNIST и CIFAR-10, в формат TFRecord.


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