TensorFlow читает и записывает данные

TensorFlow

предисловие

Только лысая голова может стать сильнее.

Текст был включен в мой репозиторий GitHub, добро пожаловать, звезда:GitHub.com/Zhongf UC очень…

Оглядываясь назад на фронт:

Как мы все знаем, для обучения модели нам сначала нужны данные. В нашем первом примере мы напрямую используем API набора данных для загрузки данных mnist. (Данные minst либо скачиваются заранее и размещаются в соответствующем каталоге, либо скачиваются напрямую из интернета по указанному им url).

В общем, мы используем TensorFlow для чтения данных из файлов TFRecord.

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

Итак, в этой статье речь пойдет о том, какчитатьДанные файла TFRecord.

1. Начало работы Чтение и запись данных из набора данных

Во-первых, давайте попробуем создать файл TFRecord, как прочитать данные из файла TFRecord и просмотреть (использовать) данные.

1.1 Создайте файл TFRecord

Теперь у нас еще нет файла TFRecord, мы можем просто написать его сами:

def write_sample_to_tfrecord():
    gmv_values = np.arange(10)
    click_values = np.arange(10)
    label_values = np.arange(10)

    with tf.python_io.TFRecordWriter("/Users/zhongfucheng/data/fashin/demo.tfrecord", options=None) as writer:
        for _ in range(10):
            feature_internal = {
                "gmv": tf.train.Feature(float_list=tf.train.FloatList(value=[gmv_values[_]])),
                "click": tf.train.Feature(int64_list=tf.train.Int64List(value=[click_values[_]])),
                "label": tf.train.Feature(int64_list=tf.train.Int64List(value=[label_values[_]]))
            }
            features_extern = tf.train.Features(feature=feature_internal)

            # 使用tf.train.Example将features编码数据封装成特定的PB协议格式
            # example = tf.train.Example(features=tf.train.Features(feature=features_extern))
            example = tf.train.Example(features=features_extern)

            # 将example数据系列化为字符串
            example_str = example.SerializeToString()

            # 将系列化为字符串的example数据写入协议缓冲区
            writer.write(example_str)


if __name__ == '__main__':
    write_sample_to_tfrecord()

Я считаю, что код должен уметь понимать каждый, на самом деле он разбит на несколько шагов:

  • Создать TFRecord Writer
  • tf.train.Feature генерирует информацию о протоколе
  • Используйте tf.train.Example для инкапсуляции закодированных данных функций в определенный формат протокола PB.
  • Сериализация данных примера в строку
  • Запишите пример данных, сериализованных в виде строки, в буфер протокола.

Использованная литература:

хорошо, теперь у нас есть файл TFRecord.

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

  • Фактически, черезtf.data.TFRecordDatasetЭтот API читает файл TFRecord и генерирует объект набора данных.

  • Обработать набор данных (форма, формат и т. д.)

  • Потреблять (обходить) наборы данных с помощью итераторов

Демонстрационный код выглядит следующим образом:

import tensorflow as tf


def read_tensorflow_tfrecord_files():
    # 定义消费缓冲区协议的parser,作为dataset.map()方法中传入的lambda:
    def _parse_function(single_sample):
        features = {
            "gmv": tf.FixedLenFeature([1], tf.float32),
            "click": tf.FixedLenFeature([1], tf.int64),  # ()或者[]没啥影响
            "label": tf.FixedLenFeature([1], tf.int64)
        }
        parsed_features = tf.parse_single_example(single_sample, features=features)

        # 对parsed 之后的值进行cast.
        gmv = tf.cast(parsed_features["gmv"], tf.float64)
        click = tf.cast(parsed_features["click"], tf.float64)
        label = tf.cast(parsed_features["label"], tf.float64)

        return gmv, click, label

    # 开始定义dataset以及解析tfrecord格式
    filenames = tf.placeholder(tf.string, shape=[None])

    # 定义dataset 和 一些列trasformation method
    dataset = tf.data.TFRecordDataset(filenames)
    parsed_dataset = dataset.map(_parse_function)  # 消费缓冲区需要定义在dataset 的map 函数中
    batchd_dataset = parsed_dataset.batch(3)

    # 创建Iterator
    sample_iter = batchd_dataset.make_initializable_iterator()
    # 获取next_sample
    gmv, click, label = sample_iter.get_next()
    training_filenames = [
        "/Users/zhongfucheng/data/fashin/demo.tfrecord"]
    with tf.Session() as session:
        # 初始化带参数的Iterator
        session.run(sample_iter.initializer, feed_dict={filenames: training_filenames})
        # 读取文件
        print(session.run(gmv))


if __name__ == '__main__':
    read_tensorflow_tfrecord_files()

Без исключения мы можем вывести этот результат:

[[0.]
 [1.]
 [2.]]

хорошо, теперь у нас есть общее представление о том, как написать файл TFRecord, как прочитать данные файла TFRecord и использовать данные.

Во-вторых, поясняются термины эпохи и размера партии.

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

2.1epoch

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

Это может привести нас кdataset.repeat()метод, этот метод может сделать текущий набор данныхповторениеснова. Например, исходный набор данных[1,2,3,4,5], если я позвонюdataset.repeat(2), тогда наш набор данных становится[1,2,3,4,5],[1,2,3,4,5]

  • Поэтому будет поговорка: если исходные данные представляют собой одну эпоху, используйте repeat(5), чтобы превратить их в 5 эпох.

2.2batchSize

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

TensorFlow также предоставляет нам методы для установки:dataset.batch(), batchSize вводится в API следующим образом:

representing the number of consecutive elements of this dataset to combine in a single batch

Как правило, перед каждой тренировкой мыВесь набор данных не в порядке, чтобы повысить эффективность обучения нашей модели. API, который мы используем здесь:dataset.shffle();

В-третьих, давайте поговорим о наборах данных

Схему метода (часть) набора данных я взял из введения на официальном сайте:

dataset的方法图

Набор данных выполняет три основные функции:

  • Создать экземпляр набора данных
    • Создано из файла (например, TFRecord)
    • Создано по памяти
  • Преобразование данных в наборе данных
    • Например, указанный выше пакет(), общийmap(),flat_map(),zip(),repeat()и т.д
    • Обычно это указано в документациипример, запустите его, чтобы узнать соответствующее значение.
  • Создайте итератор для обхода данных набора данных

3.1 Об итераторах

Существует четыре типа итераторов:

  • не замужем. Одна итерация по набору данных, параметризация не поддерживается
  • итерируемая инициализация
    • Его необходимо инициализировать перед использованием,Поддержка входящих параметров. Ориентирован на один и тот же набор данных
  • Возможность повторной инициализации: один и тот же итератор считывает данные из разных наборов данных.
    • Объекты DataSet имеют одинаковую структуру и могут использоваться сtf.data.Iterator.from_structureинициализировать
    • проблема:Каждый раз, когда итератор переключается, данные печатаются с самого начала.
  • Feedable (также итератор, созданный с тем же результатом из объекта)
    • позволяет вампереключаться между двумя наборами данныхпитаемый итератор
    • Реализовано через обработчик строк.
    • Питаемые итераторы переключаются между разными итераторами,можно сделать не начав с нуля.

Краткое содержание:

  • 1. Одиночный итератор Это самый простой вариант, но его нельзя использовать повторно и он не справляется с требованием параметризации набора данных.
  • 2. Итератор, который можно инициализировать, который может удовлетворить набор данных для многократной загрузки данных и удовлетворения требований параметризации.
  • 3. Переинициализируемый итератор, который может подключаться к разным наборам данных, то есть может читать данные из разных наборов данных.
  • 4. Feedable Iterator, который позволяет программе выбирать правильный итератор во время выполнения путем подачи.Разница между ним и реинициализируемым итератором заключается в том, что его данные переключаются между разными итераторами.Это можно сделать, не начиная заново читать данные.

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

def read_tensorflow_tfrecord_files():
    # 开始定义dataset以及解析tfrecord格式.
    train_filenames = tf.placeholder(tf.string, shape=[None])
    vali_filenames = tf.placeholder(tf.string, shape=[None])

    # 加载train_dataset   batch_inputs这个方法每个人都不一样的,这个方法我就不给了。
    train_dataset = batch_inputs([
        train_filenames], batch_size=5, type=False,
        num_epochs=2, num_preprocess_threads=3)
    # 加载validation_dataset  batch_inputs这个方法每个人都不一样的,这个方法我就不给了。
    validation_dataset = batch_inputs([vali_filenames
                                       ], batch_size=5, type=False,
                                      num_epochs=2, num_preprocess_threads=3)

    # 创建出string_handler()的迭代器(通过相同数据结构的dataset来构建)
    handle = tf.placeholder(tf.string, shape=[])
    iterator = tf.data.Iterator.from_string_handle(
        handle, train_dataset.output_types, train_dataset.output_shapes)

    # 有了迭代器就可以调用next方法了。
    itemid = iterator.get_next()

    # 指定哪种具体的迭代器,有单次迭代的,有初始化的。
    training_iterator = train_dataset.make_initializable_iterator()
    validation_iterator = validation_dataset.make_initializable_iterator()

    # 定义出placeholder的值
    training_filenames = [
        "/Users/zhongfucheng/tfrecord_test/data01aa"]
    validation_filenames = ["/Users/zhongfucheng/tfrecord_validation/part-r-00766"]

    with tf.Session() as sess:
        # 初始化迭代器
        training_handle = sess.run(training_iterator.string_handle())
        validation_handle = sess.run(validation_iterator.string_handle())

        for _ in range(2):
            sess.run(training_iterator.initializer, feed_dict={train_filenames: training_filenames})
            print("this is training iterator ----")

            for _ in range(5):
                print(sess.run(itemid, feed_dict={handle: training_handle}))

            sess.run(validation_iterator.initializer,
                     feed_dict={vali_filenames: validation_filenames})

            print("this is validation iterator ")
            for _ in range(5):
                print(sess.run(itemid, feed_dict={vali_filenames: validation_filenames, handle: validation_handle}))


if __name__ == '__main__':
    read_tensorflow_tfrecord_files()

Использованная литература:

3.2 ссылка на набор данных

Просматривая информацию, я нашел несколько хорошо написанных блогов:

Наконец

рад вывестигалантерейные товарыОбщедоступный номер технологии Java: Java3y. В паблике более 200 статейоригинальныйТехнические статьи, обширные видеоресурсы, красивые карты мозга — идите сюдаобрати внимание нанемного!

В следующей статье мы поговорим о том, как понять ось~

帅的人都关注了

Я думаю, что моя статья хорошо написана, пожалуйста, нажмитеотличный!