предисловие
Только лысая голова может стать сильнее.
Текст был включен в мой репозиторий 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();
В-третьих, давайте поговорим о наборах данных
Схему метода (часть) набора данных я взял из введения на официальном сайте:
Набор данных выполняет три основные функции:
-
Создать экземпляр набора данных
- Создано из файла (например, TFRecord)
- Создано по памяти
-
Преобразование данных в наборе данных
- Например, указанный выше пакет(), общий
map(),flat_map(),zip(),repeat()
и т.д - Обычно это указано в документациипример, запустите его, чтобы узнать соответствующее значение.
- Например, указанный выше пакет(), общий
- Создайте итератор для обхода данных набора данных
3.1 Об итераторах
Существует четыре типа итераторов:
- не замужем. Одна итерация по набору данных, параметризация не поддерживается
- итерируемая инициализация
- Его необходимо инициализировать перед использованием,Поддержка входящих параметров. Ориентирован на один и тот же набор данных
- Возможность повторной инициализации: один и тот же итератор считывает данные из разных наборов данных.
- Объекты DataSet имеют одинаковую структуру и могут использоваться с
tf.data.Iterator.from_structure
инициализировать - проблема:Каждый раз, когда итератор переключается, данные печатаются с самого начала.
- Объекты DataSet имеют одинаковую структуру и могут использоваться с
- 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 ссылка на набор данных
Просматривая информацию, я нашел несколько хорошо написанных блогов:
- у-у-у. Краткое описание.com/afraid/91803ah 119…
- Ирвинг Чжан 0512.GitHub.IO/2018/04/19/…
- Woohoo.фибула taro.com/index.PHP/2…
Наконец
рад вывестигалантерейные товарыОбщедоступный номер технологии Java: Java3y. В паблике более 200 статейоригинальныйТехнические статьи, обширные видеоресурсы, красивые карты мозга — идите сюдаобрати внимание нанемного!
В следующей статье мы поговорим о том, как понять ось~
Я думаю, что моя статья хорошо написана, пожалуйста, нажмитеотличный!