TFRecord و tf.train مثال

مشاهده در TensorFlow.org در Google Colab اجرا کنید مشاهده منبع در GitHub دانلود دفترچه یادداشت

فرمت TFRecord یک قالب ساده برای ذخیره دنباله ای از سوابق باینری است.

بافر پروتکل یک کراس پلت فرم، کتابخانه متقابل زبان برای ترتیب کارآمد از داده های ساخت یافته.

پیام های پروتکل های تعریف شده .proto فایل ها، این اغلب ساده ترین راه برای درک یک نوع پیام.

tf.train.Example پیام (protobuf) یک نوع پیام انعطاف پذیر است که نشان دهنده یک است {"string": value} نقشه برداری. این است که برای استفاده با TensorFlow طراحی شده است و در سراسر API های سطح بالاتر مانند استفاده TFX .

این نوت بوک نشان می دهد که چگونه برای ایجاد، تجزیه، و استفاده از tf.train.Example پیام، و سپس مرتب، نوشتن، و خواندن tf.train.Example پیام به و از .tfrecord فایل های.

برپایی

import tensorflow as tf

import numpy as np
import IPython.display as display

tf.train.Example

انواع داده ها برای tf.train.Example

اساسا، یک tf.train.Example است {"string": tf.train.Feature} نقشه برداری.

tf.train.Feature نوع پیام می توانید یکی از سه نوع قبول (رجوع کنید به .proto فایل برای مرجع). بیشتر انواع عمومی دیگر را می توان به یکی از موارد زیر مجبور کرد:

  1. tf.train.BytesList (انواع زیر می توان مجبور کند)

    • string
    • byte
  2. tf.train.FloatList (انواع زیر می توان مجبور کند)

    • float ( float32 )
    • double ( float64 )
  3. tf.train.Int64List (انواع زیر می توان مجبور کند)

    • bool
    • enum
    • int32
    • uint32
    • int64
    • uint64

به منظور تبدیل یک نوع TensorFlow استاندارد به یک tf.train.Example سازگار tf.train.Feature ، شما می توانید توابع میانبر زیر استفاده کنید. توجه داشته باشید که هر تابع یک مقدار ورودی اسکالر طول می کشد و یک گرداند tf.train.Feature حاوی یکی از سه list انواع فوق:

# The following functions can be used to convert a value to a type compatible
# with tf.train.Example.

def _bytes_feature(value):
  """Returns a bytes_list from a string / byte."""
  if isinstance(value, type(tf.constant(0))):
    value = value.numpy() # BytesList won't unpack a string from an EagerTensor.
  return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))

def _float_feature(value):
  """Returns a float_list from a float / double."""
  return tf.train.Feature(float_list=tf.train.FloatList(value=[value]))

def _int64_feature(value):
  """Returns an int64_list from a bool / enum / int / uint."""
  return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))

در زیر چند نمونه از نحوه عملکرد این توابع آورده شده است. به انواع مختلف ورودی و انواع خروجی استاندارد توجه کنید. اگر نوع ورودی برای تابع یکی از انواع اجبار که در بالا ذکر مطابقت ندارد، تابع یک استثنا افزایش (به عنوان مثال _int64_feature(1.0) خطا خواهد شد چون 1.0 یک شناور بنابراین، باید آن را با استفاده است _float_feature تابع به جای ):

print(_bytes_feature(b'test_string'))
print(_bytes_feature(u'test_bytes'.encode('utf-8')))

print(_float_feature(np.exp(1)))

print(_int64_feature(True))
print(_int64_feature(1))
bytes_list {
  value: "test_string"
}

bytes_list {
  value: "test_bytes"
}

float_list {
  value: 2.7182817459106445
}

int64_list {
  value: 1
}

int64_list {
  value: 1
}

همه پیام پروتو را می توان به یک فایل باینری رشته با استفاده از مرتب .SerializeToString روش:

feature = _float_feature(np.exp(1))

feature.SerializeToString()
b'\x12\x06\n\x04T\xf8-@'

ایجاد یک tf.train.Example پیام

فرض کنید می خواهید برای ایجاد یک tf.train.Example پیام از داده های موجود. در عمل، مجموعه داده ممکن است از هر نقطه آمده، اما این روش ایجاد tf.train.Example پیام از یک مشاهده تنها همان خواهد شد:

  1. در هر مشاهده، هر نیازهای ارزش به یک تبدیل می شود tf.train.Feature حاوی یکی از 3 نوع سازگار، با استفاده از یکی از توابع فوق.

  2. شما یک نقشه (فرهنگ لغت) از رشته نام ویژگی تا مقدار ویژگی رمزگذاری شده تولید شده در شماره 1 ایجاد می کنید.

  3. نقشه های تولید شده در مرحله 2 به یک تبدیل Features پیام .

در این نوت بوک ، با استفاده از NumPy یک مجموعه داده ایجاد می کنید.

این مجموعه داده دارای 4 ویژگی است:

  • یکی از ویژگی های بولی، False یا True با احتمال برابر
  • از ویژگی های عدد صحیح یکنواخت به طور تصادفی از انتخاب [0, 5]
  • یک ویژگی رشته ای که از یک جدول رشته با استفاده از ویژگی عدد صحیح به عنوان فهرست ایجاد می شود
  • یک ویژگی شناور از توزیع عادی استاندارد

نمونه ای متشکل از 10000 مشاهده مستقل و یکسان از هر یک از توزیع های بالا را در نظر بگیرید:

# The number of observations in the dataset.
n_observations = int(1e4)

# Boolean feature, encoded as False or True.
feature0 = np.random.choice([False, True], n_observations)

# Integer feature, random from 0 to 4.
feature1 = np.random.randint(0, 5, n_observations)

# String feature.
strings = np.array([b'cat', b'dog', b'chicken', b'horse', b'goat'])
feature2 = strings[feature1]

# Float feature, from a standard normal distribution.
feature3 = np.random.randn(n_observations)

هر یک از این ویژگی ها را می توان به یک اجباری tf.train.Example نوع سازگار با استفاده از یکی از _bytes_feature ، _float_feature ، _int64_feature . بعد از آن شما می توانید یک tf.train.Example پیام از این ویژگی های کد گذاری:

def serialize_example(feature0, feature1, feature2, feature3):
  """
  Creates a tf.train.Example message ready to be written to a file.
  """
  # Create a dictionary mapping the feature name to the tf.train.Example-compatible
  # data type.
  feature = {
      'feature0': _int64_feature(feature0),
      'feature1': _int64_feature(feature1),
      'feature2': _bytes_feature(feature2),
      'feature3': _float_feature(feature3),
  }

  # Create a Features message using tf.train.Example.

  example_proto = tf.train.Example(features=tf.train.Features(feature=feature))
  return example_proto.SerializeToString()

به عنوان مثال، فرض کنید شما یک مشاهده واحد از مجموعه داده، [False, 4, bytes('goat'), 0.9876] . شما می توانید ایجاد و چاپ tf.train.Example پیام برای این مشاهدات با استفاده از create_message() . هر مشاهده تک نوشته به عنوان یک Features پیام به عنوان در هر بالا. توجه داشته باشید که tf.train.Example پیام فقط یک پوشه در سراسر Features پیام:

# This is an example observation from the dataset.

example_observation = []

serialized_example = serialize_example(False, 4, b'goat', 0.9876)
serialized_example
b'\nR\n\x14\n\x08feature2\x12\x08\n\x06\n\x04goat\n\x14\n\x08feature3\x12\x08\x12\x06\n\x04[\xd3|?\n\x11\n\x08feature1\x12\x05\x1a\x03\n\x01\x04\n\x11\n\x08feature0\x12\x05\x1a\x03\n\x01\x00'

برای رمزگشایی استفاده پیام همان tf.train.Example.FromString روش.

example_proto = tf.train.Example.FromString(serialized_example)
example_proto
features {
  feature {
    key: "feature0"
    value {
      int64_list {
        value: 0
      }
    }
  }
  feature {
    key: "feature1"
    value {
      int64_list {
        value: 4
      }
    }
  }
  feature {
    key: "feature2"
    value {
      bytes_list {
        value: "goat"
      }
    }
  }
  feature {
    key: "feature3"
    value {
      float_list {
        value: 0.9876000285148621
      }
    }
  }
}

جزئیات قالب TFRecords

یک فایل TFRecord حاوی دنباله ای از سوابق است. فقط می توان فایل را به صورت متوالی خواند.

هر رکورد شامل یک بایت رشته، برای داده های-حمل بار، به علاوه داده های طول، و CRC-32C ( 32 بیتی CRC با استفاده از چند جمله ای کاستانالی ) هش برای چک کردن درستی.

هر رکورد در قالب های زیر ذخیره می شود:

uint64 length
uint32 masked_crc32_of_length
byte   data[length]
uint32 masked_crc32_of_data

پرونده ها با هم ترکیب می شوند تا پرونده تولید شود. CRCS هستند که در اینجا توضیح ، و نقاب یک کنوانسیون حقوق کودک است:

masked_crc = ((crc >> 15) | (crc << 17)) + 0xa282ead8ul

TFRecord فایل با استفاده از tf.data

tf.data ماژول همچنین ابزار برای خواندن و نوشتن داده ها در TensorFlow فراهم می کند.

نوشتن یک فایل TFRecord

ساده ترین راه برای دریافت داده ها را به یک مجموعه داده است که استفاده از from_tensor_slices روش.

با استفاده از یک آرایه ، مجموعه ای از مقیاس ها را برمی گرداند:

tf.data.Dataset.from_tensor_slices(feature1)
<TensorSliceDataset shapes: (), types: tf.int64>

با استفاده از مجموعه ای از آرایه ها ، یک مجموعه داده از چندتایی را برمی گرداند:

features_dataset = tf.data.Dataset.from_tensor_slices((feature0, feature1, feature2, feature3))
features_dataset
<TensorSliceDataset shapes: ((), (), (), ()), types: (tf.bool, tf.int64, tf.string, tf.float64)>
# Use `take(1)` to only pull one example from the dataset.
for f0,f1,f2,f3 in features_dataset.take(1):
  print(f0)
  print(f1)
  print(f2)
  print(f3)
tf.Tensor(True, shape=(), dtype=bool)
tf.Tensor(1, shape=(), dtype=int64)
tf.Tensor(b'dog', shape=(), dtype=string)
tf.Tensor(-0.9885608219225024, shape=(), dtype=float64)

استفاده از tf.data.Dataset.map روش برای اعمال یک تابع برای هر عنصر از یک Dataset .

تابع نقشه برداری باید در نمودار TensorFlow عمل حالت باید در عمل و بازگشت tf.Tensors . یک تابع غیر تانسور، مانند serialize_example ، می توان با پیچیده tf.py_function به آن سازگار است.

با استفاده از tf.py_function لازم است مشخص شکل و نوع اطلاعات است که در غیر این صورت در دسترس:

def tf_serialize_example(f0,f1,f2,f3):
  tf_string = tf.py_function(
    serialize_example,
    (f0, f1, f2, f3),  # Pass these args to the above function.
    tf.string)      # The return type is `tf.string`.
  return tf.reshape(tf_string, ()) # The result is a scalar.
tf_serialize_example(f0, f1, f2, f3)
<tf.Tensor: shape=(), dtype=string, numpy=b'\nQ\n\x14\n\x08feature3\x12\x08\x12\x06\n\x04R\x12}\xbf\n\x11\n\x08feature1\x12\x05\x1a\x03\n\x01\x01\n\x13\n\x08feature2\x12\x07\n\x05\n\x03dog\n\x11\n\x08feature0\x12\x05\x1a\x03\n\x01\x01'>

این تابع را روی هر عنصر در مجموعه داده اعمال کنید:

serialized_features_dataset = features_dataset.map(tf_serialize_example)
serialized_features_dataset
<MapDataset shapes: (), types: tf.string>
def generator():
  for features in features_dataset:
    yield serialize_example(*features)
serialized_features_dataset = tf.data.Dataset.from_generator(
    generator, output_types=tf.string, output_shapes=())
serialized_features_dataset
<FlatMapDataset shapes: (), types: tf.string>

و آنها را در یک فایل TFRecord بنویسید:

filename = 'test.tfrecord'
writer = tf.data.experimental.TFRecordWriter(filename)
writer.write(serialized_features_dataset)
WARNING:tensorflow:From /tmp/ipykernel_16482/3575438268.py:2: TFRecordWriter.__init__ (from tensorflow.python.data.experimental.ops.writers) is deprecated and will be removed in a future version.
Instructions for updating:
To write TFRecords to disk, use `tf.io.TFRecordWriter`. To save and load the contents of a dataset, use `tf.data.experimental.save` and `tf.data.experimental.load`

خواندن فایل TFRecord

شما همچنین می توانید فایل TFRecord با استفاده از به عنوان خوانده شده tf.data.TFRecordDataset کلاس.

اطلاعات بیشتر در مورد مصرف فایل های TFRecord با استفاده از tf.data را می توان در یافت ساخت خطوط لوله ورودی TensorFlow: tf.data راهنمای.

با استفاده از TFRecordDataset S می تواند برای استاندارد داده های ورودی و بهینه سازی عملکرد مفید است.

filenames = [filename]
raw_dataset = tf.data.TFRecordDataset(filenames)
raw_dataset
<TFRecordDatasetV2 shapes: (), types: tf.string>

در این مرحله مجموعه داده شامل سریال tf.train.Example پیام. هنگامی که روی آن تکرار می شود ، اینها را به عنوان تنسور رشته مقیاس پذیر برمی گرداند.

استفاده از .take روش برای تنها 10 رکورد اول نمایش می دهد.

for raw_record in raw_dataset.take(10):
  print(repr(raw_record))
<tf.Tensor: shape=(), dtype=string, numpy=b'\nQ\n\x14\n\x08feature3\x12\x08\x12\x06\n\x04R\x12}\xbf\n\x11\n\x08feature0\x12\x05\x1a\x03\n\x01\x01\n\x13\n\x08feature2\x12\x07\n\x05\n\x03dog\n\x11\n\x08feature1\x12\x05\x1a\x03\n\x01\x01'>
<tf.Tensor: shape=(), dtype=string, numpy=b'\nQ\n\x14\n\x08feature3\x12\x08\x12\x06\n\x04\xb5\x91\xdc\xbb\n\x11\n\x08feature1\x12\x05\x1a\x03\n\x01\x00\n\x11\n\x08feature0\x12\x05\x1a\x03\n\x01\x01\n\x13\n\x08feature2\x12\x07\n\x05\n\x03cat'>
<tf.Tensor: shape=(), dtype=string, numpy=b'\nU\n\x11\n\x08feature0\x12\x05\x1a\x03\n\x01\x00\n\x17\n\x08feature2\x12\x0b\n\t\n\x07chicken\n\x14\n\x08feature3\x12\x08\x12\x06\n\x04\xbd\x91g=\n\x11\n\x08feature1\x12\x05\x1a\x03\n\x01\x02'>
<tf.Tensor: shape=(), dtype=string, numpy=b'\nQ\n\x11\n\x08feature0\x12\x05\x1a\x03\n\x01\x00\n\x13\n\x08feature2\x12\x07\n\x05\n\x03dog\n\x11\n\x08feature1\x12\x05\x1a\x03\n\x01\x01\n\x14\n\x08feature3\x12\x08\x12\x06\n\x04e\xc5\x98>'>
<tf.Tensor: shape=(), dtype=string, numpy=b'\nS\n\x15\n\x08feature2\x12\t\n\x07\n\x05horse\n\x11\n\x08feature1\x12\x05\x1a\x03\n\x01\x03\n\x14\n\x08feature3\x12\x08\x12\x06\n\x04e\xa4|>\n\x11\n\x08feature0\x12\x05\x1a\x03\n\x01\x01'>
<tf.Tensor: shape=(), dtype=string, numpy=b'\nQ\n\x11\n\x08feature0\x12\x05\x1a\x03\n\x01\x00\n\x13\n\x08feature2\x12\x07\n\x05\n\x03cat\n\x14\n\x08feature3\x12\x08\x12\x06\n\x04\x0b\xb3\x02@\n\x11\n\x08feature1\x12\x05\x1a\x03\n\x01\x00'>
<tf.Tensor: shape=(), dtype=string, numpy=b'\nQ\n\x14\n\x08feature3\x12\x08\x12\x06\n\x04G\xa4\xda\xbf\n\x13\n\x08feature2\x12\x07\n\x05\n\x03dog\n\x11\n\x08feature0\x12\x05\x1a\x03\n\x01\x01\n\x11\n\x08feature1\x12\x05\x1a\x03\n\x01\x01'>
<tf.Tensor: shape=(), dtype=string, numpy=b'\nQ\n\x11\n\x08feature1\x12\x05\x1a\x03\n\x01\x01\n\x11\n\x08feature0\x12\x05\x1a\x03\n\x01\x00\n\x13\n\x08feature2\x12\x07\n\x05\n\x03dog\n\x14\n\x08feature3\x12\x08\x12\x06\n\x04\xd2/\xcf\xbf'>
<tf.Tensor: shape=(), dtype=string, numpy=b'\nQ\n\x11\n\x08feature0\x12\x05\x1a\x03\n\x01\x00\n\x14\n\x08feature3\x12\x08\x12\x06\n\x04<\xedO?\n\x11\n\x08feature1\x12\x05\x1a\x03\n\x01\x00\n\x13\n\x08feature2\x12\x07\n\x05\n\x03cat'>
<tf.Tensor: shape=(), dtype=string, numpy=b'\nR\n\x11\n\x08feature0\x12\x05\x1a\x03\n\x01\x01\n\x11\n\x08feature1\x12\x05\x1a\x03\n\x01\x04\n\x14\n\x08feature3\x12\x08\x12\x06\n\x041I\xe1?\n\x14\n\x08feature2\x12\x08\n\x06\n\x04goat'>

این تنسورها را می توان با استفاده از عملکرد زیر تجزیه کرد. توجه داشته باشید که feature_description اینجا لازم است به دلیل tf.data.Dataset بازدید کنندگان استفاده نمودار اعدام، و نیاز به این شرح برای ساخت شکل و نوع امضا:

# Create a description of the features.
feature_description = {
    'feature0': tf.io.FixedLenFeature([], tf.int64, default_value=0),
    'feature1': tf.io.FixedLenFeature([], tf.int64, default_value=0),
    'feature2': tf.io.FixedLenFeature([], tf.string, default_value=''),
    'feature3': tf.io.FixedLenFeature([], tf.float32, default_value=0.0),
}

def _parse_function(example_proto):
  # Parse the input `tf.train.Example` proto using the dictionary above.
  return tf.io.parse_single_example(example_proto, feature_description)

روش دیگر، استفاده tf.parse example به تجزیه طیف دسته ای در یک بار. درخواست از این تابع برای هر آیتم در مجموعه داده با استفاده از tf.data.Dataset.map روش:

parsed_dataset = raw_dataset.map(_parse_function)
parsed_dataset
<MapDataset shapes: {feature0: (), feature1: (), feature2: (), feature3: ()}, types: {feature0: tf.int64, feature1: tf.int64, feature2: tf.string, feature3: tf.float32}>

برای نمایش مشاهدات در مجموعه داده از اجرای مشتاق استفاده کنید. 10000 مشاهده در این مجموعه داده وجود دارد ، اما شما فقط 10 مورد اول را نمایش می دهید. داده ها به عنوان فرهنگ لغت ویژگی ها نمایش داده می شوند. هر کدام از اقلام است tf.Tensor و numpy عنصر از این تانسور نمایش ارزش از ویژگی های:

for parsed_record in parsed_dataset.take(10):
  print(repr(parsed_record))
{'feature0': <tf.Tensor: shape=(), dtype=int64, numpy=1>, 'feature1': <tf.Tensor: shape=(), dtype=int64, numpy=1>, 'feature2': <tf.Tensor: shape=(), dtype=string, numpy=b'dog'>, 'feature3': <tf.Tensor: shape=(), dtype=float32, numpy=-0.9885608>}
{'feature0': <tf.Tensor: shape=(), dtype=int64, numpy=1>, 'feature1': <tf.Tensor: shape=(), dtype=int64, numpy=0>, 'feature2': <tf.Tensor: shape=(), dtype=string, numpy=b'cat'>, 'feature3': <tf.Tensor: shape=(), dtype=float32, numpy=-0.006731237>}
{'feature0': <tf.Tensor: shape=(), dtype=int64, numpy=0>, 'feature1': <tf.Tensor: shape=(), dtype=int64, numpy=2>, 'feature2': <tf.Tensor: shape=(), dtype=string, numpy=b'chicken'>, 'feature3': <tf.Tensor: shape=(), dtype=float32, numpy=0.05653547>}
{'feature0': <tf.Tensor: shape=(), dtype=int64, numpy=0>, 'feature1': <tf.Tensor: shape=(), dtype=int64, numpy=1>, 'feature2': <tf.Tensor: shape=(), dtype=string, numpy=b'dog'>, 'feature3': <tf.Tensor: shape=(), dtype=float32, numpy=0.298381>}
{'feature0': <tf.Tensor: shape=(), dtype=int64, numpy=1>, 'feature1': <tf.Tensor: shape=(), dtype=int64, numpy=3>, 'feature2': <tf.Tensor: shape=(), dtype=string, numpy=b'horse'>, 'feature3': <tf.Tensor: shape=(), dtype=float32, numpy=0.24672087>}
{'feature0': <tf.Tensor: shape=(), dtype=int64, numpy=0>, 'feature1': <tf.Tensor: shape=(), dtype=int64, numpy=0>, 'feature2': <tf.Tensor: shape=(), dtype=string, numpy=b'cat'>, 'feature3': <tf.Tensor: shape=(), dtype=float32, numpy=2.042178>}
{'feature0': <tf.Tensor: shape=(), dtype=int64, numpy=1>, 'feature1': <tf.Tensor: shape=(), dtype=int64, numpy=1>, 'feature2': <tf.Tensor: shape=(), dtype=string, numpy=b'dog'>, 'feature3': <tf.Tensor: shape=(), dtype=float32, numpy=-1.7081383>}
{'feature0': <tf.Tensor: shape=(), dtype=int64, numpy=0>, 'feature1': <tf.Tensor: shape=(), dtype=int64, numpy=1>, 'feature2': <tf.Tensor: shape=(), dtype=string, numpy=b'dog'>, 'feature3': <tf.Tensor: shape=(), dtype=float32, numpy=-1.6186469>}
{'feature0': <tf.Tensor: shape=(), dtype=int64, numpy=0>, 'feature1': <tf.Tensor: shape=(), dtype=int64, numpy=0>, 'feature2': <tf.Tensor: shape=(), dtype=string, numpy=b'cat'>, 'feature3': <tf.Tensor: shape=(), dtype=float32, numpy=0.81221366>}
{'feature0': <tf.Tensor: shape=(), dtype=int64, numpy=1>, 'feature1': <tf.Tensor: shape=(), dtype=int64, numpy=4>, 'feature2': <tf.Tensor: shape=(), dtype=string, numpy=b'goat'>, 'feature3': <tf.Tensor: shape=(), dtype=float32, numpy=1.7600461>}

در اینجا، tf.parse_example تابع حالت زیپ خارج tf.train.Example زمینه به تانسورها استاندارد.

فایل های TFRecord در پایتون

tf.io ماژول همچنین شامل توابع خالص پایتون برای خواندن و نوشتن فایل های TFRecord.

نوشتن یک فایل TFRecord

بعد، نوشتن 10،000 مشاهدات به فایل test.tfrecord . هر مشاهده به یک تبدیل tf.train.Example پیام، و سپس به فایل نوشته شده است. بعد از آن شما می توانید بررسی کنید که فایل test.tfrecord ایجاد شده است:

# Write the `tf.train.Example` observations to the file.
with tf.io.TFRecordWriter(filename) as writer:
  for i in range(n_observations):
    example = serialize_example(feature0[i], feature1[i], feature2[i], feature3[i])
    writer.write(example)
du -sh {filename}
984K    test.tfrecord

خواندن فایل TFRecord

این تانسورها مرتب به راحتی می توان با استفاده از تجزیه tf.train.Example.ParseFromString :

filenames = [filename]
raw_dataset = tf.data.TFRecordDataset(filenames)
raw_dataset
<TFRecordDatasetV2 shapes: (), types: tf.string>
for raw_record in raw_dataset.take(1):
  example = tf.train.Example()
  example.ParseFromString(raw_record.numpy())
  print(example)
features {
  feature {
    key: "feature0"
    value {
      int64_list {
        value: 1
      }
    }
  }
  feature {
    key: "feature1"
    value {
      int64_list {
        value: 1
      }
    }
  }
  feature {
    key: "feature2"
    value {
      bytes_list {
        value: "dog"
      }
    }
  }
  feature {
    key: "feature3"
    value {
      float_list {
        value: -0.9885607957839966
      }
    }
  }
}

که بازده یک tf.train.Example پروتو است که dificult برای استفاده به عنوان است، اما آن را اساسا یک نماینده از:

Dict[str,
     Union[List[float],
           List[int],
           List[str]]]

کد زیر را به صورت دستی تبدیل Example به یک فرهنگ لغت از آرایه نامپای، بدون استفاده از TensorFlow عملیات. برای اشاره فایل PROTO برای detials.

result = {}
# example.features.feature is the dictionary
for key, feature in example.features.feature.items():
  # The values are the Feature objects which contain a `kind` which contains:
  # one of three fields: bytes_list, float_list, int64_list

  kind = feature.WhichOneof('kind')
  result[key] = np.array(getattr(feature, kind).value)

result
{'feature1': array([1]),
 'feature0': array([1]),
 'feature2': array([b'dog'], dtype='|S3'),
 'feature3': array([-0.9885608])}

Walkthrough: خواندن و نوشتن داده های تصویر

این نمونه ای از نحوه خواندن و نوشتن داده های تصویر با استفاده از TFRecords است. با استفاده از یک تصویر به عنوان داده ورودی ، داده ها را به عنوان یک فایل TFRecord می نویسید ، سپس فایل را می خوانید و تصویر را نمایش می دهید.

این می تواند مفید باشد ، برای مثال ، اگر می خواهید از چندین مدل در یک مجموعه داده ورودی استفاده کنید. به جای ذخیره سازی داده های تصویر به صورت خام ، می توان آنها را در قالب TFRecords پیش پردازش کرد و می تواند در پردازش و مدل سازی بیشتر مورد استفاده قرار گیرد.

اول، اجازه دهید دانلود این تصویر از یک گربه در برف و این عکس از پل ویلیامزبورگ، NYC دست ساخت است.

واکشی تصاویر

cat_in_snow  = tf.keras.utils.get_file(
    '320px-Felis_catus-cat_on_snow.jpg',
    'https://storage.googleapis.com/download.tensorflow.org/example_images/320px-Felis_catus-cat_on_snow.jpg')

williamsburg_bridge = tf.keras.utils.get_file(
    '194px-New_East_River_Bridge_from_Brooklyn_det.4a09796u.jpg',
    'https://storage.googleapis.com/download.tensorflow.org/example_images/194px-New_East_River_Bridge_from_Brooklyn_det.4a09796u.jpg')
Downloading data from https://storage.googleapis.com/download.tensorflow.org/example_images/320px-Felis_catus-cat_on_snow.jpg
24576/17858 [=========================================] - 0s 0us/step
32768/17858 [=======================================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/download.tensorflow.org/example_images/194px-New_East_River_Bridge_from_Brooklyn_det.4a09796u.jpg
16384/15477 [===============================] - 0s 0us/step
24576/15477 [===============================================] - 0s 0us/step
display.display(display.Image(filename=cat_in_snow))
display.display(display.HTML('Image cc-by: <a "href=https://commons.wikimedia.org/wiki/File:Felis_catus-cat_on_snow.jpg">Von.grzanka</a>'))

jpeg

display.display(display.Image(filename=williamsburg_bridge))
display.display(display.HTML('<a "href=https://commons.wikimedia.org/wiki/File:New_East_River_Bridge_from_Brooklyn_det.4a09796u.jpg">From Wikimedia</a>'))

jpeg

فایل TFRecord را بنویسید

مانند قبل، رمز به عنوان ویژگی های سازگار با انواع tf.train.Example . این ویژگی خام رشته تصویر، و همچنین ارتفاع، عرض، عمق، و خودسرانه های label ویژگی. مورد دوم هنگام نوشتن فایل برای تمایز بین تصویر گربه و تصویر پل استفاده می شود. استفاده از 0 برای تصویر گربه، و 1 برای تصویر پل:

image_labels = {
    cat_in_snow : 0,
    williamsburg_bridge : 1,
}
# This is an example, just using the cat image.
image_string = open(cat_in_snow, 'rb').read()

label = image_labels[cat_in_snow]

# Create a dictionary with features that may be relevant.
def image_example(image_string, label):
  image_shape = tf.io.decode_jpeg(image_string).shape

  feature = {
      'height': _int64_feature(image_shape[0]),
      'width': _int64_feature(image_shape[1]),
      'depth': _int64_feature(image_shape[2]),
      'label': _int64_feature(label),
      'image_raw': _bytes_feature(image_string),
  }

  return tf.train.Example(features=tf.train.Features(feature=feature))

for line in str(image_example(image_string, label)).split('\n')[:15]:
  print(line)
print('...')
features {
  feature {
    key: "depth"
    value {
      int64_list {
        value: 3
      }
    }
  }
  feature {
    key: "height"
    value {
      int64_list {
        value: 213
      }
...

توجه داشته باشید که همه از ویژگی های در حال حاضر در ذخیره شده tf.train.Example پیام. بعد، functionalize کد بالا و ارسال پیام به عنوان مثال یک فایل با نام images.tfrecords :

# Write the raw image files to `images.tfrecords`.
# First, process the two images into `tf.train.Example` messages.
# Then, write to a `.tfrecords` file.
record_file = 'images.tfrecords'
with tf.io.TFRecordWriter(record_file) as writer:
  for filename, label in image_labels.items():
    image_string = open(filename, 'rb').read()
    tf_example = image_example(image_string, label)
    writer.write(tf_example.SerializeToString())
du -sh {record_file}
36K images.tfrecords

فایل TFRecord را بخوانید

شما در حال حاضر مسیر File- images.tfrecords دنده هم اکنون می توانید تکرار بیش از سوابق در آن را به خواندن آنچه شما نوشته است. با توجه به اینکه در این مثال شما فقط تصویر را بازتولید می کنید ، تنها ویژگی مورد نیاز شما رشته تصویر خام است. عصاره آن را با استفاده از مصمم در بالا شرح داده، یعنی example.features.feature['image_raw'].bytes_list.value[0] . همچنین می توانید از برچسب ها برای تعیین اینکه کدام پرونده گربه و کدام یک پل است استفاده کنید:

raw_image_dataset = tf.data.TFRecordDataset('images.tfrecords')

# Create a dictionary describing the features.
image_feature_description = {
    'height': tf.io.FixedLenFeature([], tf.int64),
    'width': tf.io.FixedLenFeature([], tf.int64),
    'depth': tf.io.FixedLenFeature([], tf.int64),
    'label': tf.io.FixedLenFeature([], tf.int64),
    'image_raw': tf.io.FixedLenFeature([], tf.string),
}

def _parse_image_function(example_proto):
  # Parse the input tf.train.Example proto using the dictionary above.
  return tf.io.parse_single_example(example_proto, image_feature_description)

parsed_image_dataset = raw_image_dataset.map(_parse_image_function)
parsed_image_dataset
<MapDataset shapes: {depth: (), height: (), image_raw: (), label: (), width: ()}, types: {depth: tf.int64, height: tf.int64, image_raw: tf.string, label: tf.int64, width: tf.int64}>

بازیابی تصاویر از فایل TFRecord:

for image_features in parsed_image_dataset:
  image_raw = image_features['image_raw'].numpy()
  display.display(display.Image(data=image_raw))

jpeg

jpeg