Xiaobai изучает PyTorch | 17 Создание и чтение файлов TFrec

искусственный интеллект

Когда я впервые столкнулся с файлом TFrec, я тоже был сильно обманут:

Вы можете видеть, что файл.tfrecсуффикс, и помните, что размер этого файла составляет 186,72 МБ.

1 Зачем использовать файл tfrec

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

  • занимают место на диске;
  • Чтение файлов по одному требует времени

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

Прежде чем мы узнаем, что файл tfrec больше 100 МБ, это потому, что этот файл tfrec хранит много изображений, что похоже на сжатие.После распаковки tfrec мы можем получить часть набора данных.Когда мы распаковываем все rfrec файлы После этого можно получить все наборы данных.

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

2 Внутренняя структура файла tfrec

tfrec — это формат хранения набора данных tensorflow, tensorflow может эффективночитать и обрабатывать эти наборы данных, поэтому я видел некоторые наборы данных, потому что они представляют собой файлы tfrec, поэтому используйте TF для чтения набора данных, а затем используйте pytorch для обучения модели.

Как упоминалось ранее, в файле tfrec есть несколько сэмплов, поэтомуtfrec может быть несколькоtf.train.ExampleПоследовательность файлов (каждый пример является образцом), то каждыйtf.train.Exampleснова на несколькоtf.train.Featuresсостав словаря. этоПризнаки можно понимать как некоторую информацию об этом образце.Если это образец изображения, то должен быть признак, который представляет собой данные значения пикселя изображения, и признаки, которые являются значением метки изображения; если это образец изображения задача прогнозирования, то эта функция может быть некоторыми строковыми функциями.

3 Создайте файл tfrec

import tensorflow as tf
import glob
# 先记录一下要保存的tfrec文件的名字
tfrecord_file = './train.tfrec'
# 获取指定目录的所有以jpeg结尾的文件list
images = glob.glob('./*.jpeg')
with tf.io.TFRecordWriter(tfrecord_file) as writer:
    for filename in images:
        image = open(filename, 'rb').read()  # 读取数据集图片到内存,image 为一个 Byte 类型的字符串
        feature = {  # 建立 tf.train.Feature 字典
            'image': tf.train.Feature(bytes_list=tf.train.BytesList(value=[image])),  # 图片是一个 Bytes 对象
            'label': tf.train.Feature(int64_list=tf.train.Int64List(value=[1])),
            'float':tf.train.Feature(float_list=tf.train.FloatList(value=[1.0,2.0])),
            'name':tf.train.Feature(bytes_list=tf.train.BytesList(value=[str.encode(filename)]))
        }
        # tf.train.Example 在 tf.train.Features 外面又多了一层封装
        example = tf.train.Example(features=tf.train.Features(feature=feature))  # 通过字典建立 Example
        writer.write(example.SerializeToString())  # 将 Example 序列化并写入 TFRecord 文件

Места, на которые нам нужно обратить внимание в коде:

  • Сначала прочитайте изображение, а затем создайте словарь в формате этого примера;
  • В приведенном выше коде в словаре четыре атрибута, первый — это значение пикселя самого изображения изображения, затем идет метка, метка имеет тип int, затем идет тип float, а имя — это строковый тип, этот строковый тип необходим. Он может быть сохранен только в том случае, если он преобразован в байтовый тип, поэтому он используется здесь.str.encodeконвертировать строки в байты;
  • Затем функции инкапсулируются с помощью примера, а затем пример записывается в файл tfrec.

Рекомендуется сохранить этот фрагмент кода для прямого использования и копирования в будущем. Создание файла tfrec должно быть неизбежным шагом для обработки изображений tensorflow.

4 Чтение файла tfrec

Теперь, после того как мы запустим приведенный выше код, он должен сгенерировать./train.tfrecфайл, а затем мы снова прочитаем этот файл.

import tensorflow as tf

dataset = tf.data.TFRecordDataset('./train.tfrec')

def decode(example):
    feature_description = {
        'image': tf.io.FixedLenFeature([], tf.string),
        'label': tf.io.FixedLenFeature([], tf.int64),
        'float': tf.io.FixedLenFeature([1, 2], tf.float32),
        'name': tf.io.FixedLenFeature([], tf.string)
    }
    feature_dict = tf.io.parse_single_example(example, feature_description)
    feature_dict['image'] = tf.io.decode_jpeg(feature_dict['image'])  # 解码 JEPG 图片
    return feature_dict

dataset = dataset.map(decode).batch(4)
for i in dataset.take(1):
    print(i['image'].shape)
    print(i['label'].shape)
    print(i['float'].shape)
    print(bytes.decode(i['name'][0].numpy()))
  • первое использованиеМетод, предназначенный для чтения файлов tfrec.tf.data.TFRecordDataset, прочитать его и создать набор данных, но этот набор данных нельзя использовать напрямую, и требуется некоторая расшифровка примера в tfrec;
  • Напишите декодирующую функцию decode самостоятельно.Сначала напишите описание функции.Мы знаем, что каждый пример имеет четыре функции при сохранении tfrec.Здесь нам нужно определить ее тип для каждой функции, будь то строка, целое число или число с плавающей запятой.
  • Затем через это описание функции иtf.io.parse_single_exampleметод извлечения соответствующих признаков из примера;
  • Поскольку изображение является тензором изображения, и когда мы его читаем, это тип чтения tf.string, поэтому используйтеtf.io.decode_jpeg()декодировать строку в тензор.
  • Наконец, используйте то, чему учили на предыдущем уроке..batch(4)Каждая партия набора данных содержит четыре образца.

Вывод приведенного выше кода:

Следует отметить, что это способ преобразования имени в строковый тип.Если вы запустили приведенный выше код локально, вы можете увидеть, что такое тип i['name'], а затем попробовать самостоятельно преобразовать его в строковый тип. . Приведенный выше код может успешно конвертироваться.

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