Как проверить структуру файла TFRecord в TensorFlow 1.13? - PullRequest
1 голос
/ 26 апреля 2019

Меня довольно смущает формат файла TFRecord и то, как его использовать. У меня есть TFRecord, но я мало представляю, что именно он содержит и какова его структура. Как я могу распечатать и проверить TFRecord и / или его TFExamples? По сути, я задаю то же, что и этот вопрос , но ответы на него устарели. Печать output_shapes, output_types или output_classes моего TFRecord ничего не говорит мне (почему?). Функция tf.io.tf_record_iterator() устарела, но наборы данных TFRecord теперь выглядят итеративными (но тогда зачем одному все еще нужны другие итераторы?). Тем не менее, простая печать каждой итерации возвращает тарабарщину, и tf.train.Example.FromString(example) создает TypeError: a bytes-like object is required, not 'tensorflow.python.framework.ops.EagerTensor'. Это все довольно запутанно. Простая инициализация tf.data.Dataset с использованием from_tensor_slices() кажется намного проще для проверки, и фактически дает информацию о его форме и типе.

1 Ответ

1 голос
/ 26 апреля 2019

Вы можете использовать tf.python_io.tf_record_iterator для проверки файла tfrecords.Это создает поколение.Чтобы получить доступ к одному примеру, вам нужно выполнить итерацию по нему:

for str_rec in tf.python_io.tf_record_iterator('file.tfrecords'):
    example = tf.train.Example()
    example.ParseFromString(str_rec)
    print(dict(example.features.feature).keys())

Это выведет имена и типы объектов (в данном случае bytes_list)

dict_keys(['label', 'width', 'image_raw', 'height'])

Для вывода типов данных такженужно

print(dict(example.features.feature).values())

Но это также напечатает необработанную строку, и вы можете достичь предела длины экрана.

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

string = example.features.feature['image_raw'].bytes_list.value[0]
output = np.fromstring(string, dtype)

Подробнее об этом можно прочитать здесь https://www.tensorflow.org/tutorials/load_data/tf_records

РЕДАКТИРОВАТЬ: ЕСЛИ режим ожидания включенВы можете напрямую перебирать объект набора данных, используя либо numpy для декодирования

for str_rec in tf.data.TFRecordDataset('file.tfrecords'):
    output = np.fromstring(str_rec.numpy(), dtype))

, либо собственный TF.tf.io.decode_raw(str_rec, tf.uint8))

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

...