TFRecord es el formato de almacenamiento de conjuntos de datos en TensorFlow. Cuando organizamos los conjuntos de datos en formato TFRecord, TensorFlow puede leer y procesar estos conjuntos de datos de manera eficiente, lo que nos ayuda a realizar entrenamientos de modelos a gran escala de manera más eficiente.
Formato: TFRecord se puede entender como un archivo de lista compuesto por una serie de elementos tf.train.Example serializados, y cada tf.train.Example se compone de varios diccionarios tf.train.Feature. El formulario es el siguiente:
[
{
# example 1 (tf.train.Example)
'feature_1': tf.train.Feature,
...
'feature_k': tf.train.Feature
},
...
{
# example N (tf.train.Example)
'feature_1': tf.train.Feature,
...
'feature_k': tf.train.Feature
}
]
# 字典结构如
feature = {
'image': tf.train.Feature(bytes_list=tf.train.BytesList(value=[image])),
'label': tf.train.Feature(int64_list=tf.train.Int64List(value=[label]))
}
- Guardar TFRecord
- Para organizar varios conjuntos de datos en formato TFRecord, debemos realizar los siguientes pasos para cada elemento del conjunto de datos:
leer el elemento de datos en la memoria - Convierta este elemento en un objeto tf.train.Example (cada tf.train.Example consta de varios diccionarios tf.train.Feature, por lo que primero debe crear un diccionario de características);
- Serialice el objeto tf.train.Example en una cadena y escríbalo en un archivo TFRecord a través de un tf.io.TFRecordWriter predefinido.
- Para organizar varios conjuntos de datos en formato TFRecord, debemos realizar los siguientes pasos para cada elemento del conjunto de datos:
- Leer datos TFRecord
- Lea el archivo TFRecord original a través de tf.data.TFRecordDataset (en este momento, el objeto tf.train.Example en el archivo no se ha deserializado) y obtenga un objeto de conjunto de datos tf.data.Dataset;
- A través del método Dataset.map, ejecute la función tf.io.parse_single_example para cada cadena tf.train.Example serializada en el objeto del conjunto de datos para lograr la deserialización.
código:
# -*- coding: utf-8 -*-
"""
@Time : 2022-08-03 22:02
@Author : peyzhang
@File : tfRecode.py
@Software: PyCharm
"""
import tensorflow as tf
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"
train_cars_dir = 'F:/AI/data//train/car/'
train_human_dir = 'F:/AI/data//train/dog/'
tfrecord_file = 'F:/AI/data//train.tfrecords'
def main():
train_car_filenames = [train_cars_dir + filename for filename in os.listdir(train_cars_dir)]
train_dog_filenames = [train_human_dir + filename for filename in os.listdir(train_human_dir)]
train_filename = train_car_filenames + train_dog_filenames
train_labels = [0] * len(train_car_filenames) + [1] *len(train_dog_filenames)
print(train_filename)
print(train_labels)
with tf.io.TFRecordWriter(tfrecord_file) as writer:
for filename , label in zip(train_filename, train_labels):
image = open(filename,"rb").read()
feature = {
"image": tf.train.Feature(bytes_list=tf.train.BytesList(value=[image])),
"label": tf.train.Feature(int64_list=tf.train.Int64List(value=[label]))
}
example = tf.train.Example(features=tf.train.Features(feature=feature))
writer.write(example.SerializeToString())
def readTFrecord():
raw_dataset = tf.data.TFRecordDataset(tfrecord_file)
feature_description = {
'image': tf.io.FixedLenFeature([], tf.string),
'label': tf.io.FixedLenFeature([], tf.int64),
}
def decoding(example_string):
fdict = tf.io.parse_single_example(example_string, feature_description)
fdict['image'] = tf.io.decode_jpeg(fdict['image'])
return fdict['image'], fdict['label']
dataseate = raw_dataset.map(decoding)
for iamge , label in dataseate:
print(iamge, label)
if __name__ == '__main__':
# main()
readTFrecord()