Tensorflow: невозможно извлечь имя файла из tfrecord

Я записал изображение, метку и имя файла в файл tfrecords. Когда я пытаюсь декодировать файл, я не могу преобразовать имя файла в строку из tf.string.

Код, который я написал для преобразования его в файл tfrecords:

num_batches = 6
batch_size = math.ceil(X_training.shape[0] / num_batches)

for i in range(num_batches):
    train_path = os.path.join("data","batch_" + str(i) + '.tfrecords')
    writer = tf.python_io.TFRecordWriter(train_path)
    start_row = i * batch_size
    end_row = start_row + batch_size - 1

    for idx in range(start_row, end_row):
        try:
            label = y_tr[idx]
            filename = train_filenames[idx].tostring()
            image = X_tr[idx]
            image_raw = image.tostring()
        except:
            continue

        example = tf.train.Example(
            features=tf.train.Features(
              feature = {
                'label': _int64_feature(label),
                'filename': _bytes_feature(filename),
                'image': _bytes_feature(image_raw),
              }))

        serialized = example.SerializeToString()
        writer.write(serialized)

Для чтения и декодирования файла tfrecords у меня есть функция:

def read_and_decode_single_example(filenames):
    filename_queue = tf.train.string_input_producer(filenames)

    reader = tf.TFRecordReader()

    _, serialized_example = reader.read(filename_queue)
    features = tf.parse_single_example(
        serialized_example,
        features = {
            'label': tf.FixedLenFeature([], tf.int64),
            'filename': tf.FixedLenFeature([], tf.string),
            'image': tf.FixedLenFeature([], tf.string)
        })


    label = features['label']
    image = tf.decode_raw(features['image'], tf.uint8)
    image = tf.reshape(image, [499, 499, 1])
    filename = features['filename']

    return label, image, filename

Когда я декодирую разные пакеты, возвращаемое имя файла выглядит так:

b'P\x00\x00\x00_\x00\x00\x000\x00\x00\x000\x00\x00\x001\x00\x00\x004\x00\x00\x008\x00\x00\x00_\x00\x00\x00R\x00\x00\x00I\x00\x00\x00G\x00\x00\x00H\x00\x00\x00T\x00\x00\x00_\x00\x00\x00M\x00\x00\x00L\x00\x00\x00O\x00\x00\x00.\x00\x00\x00j\x00\x00\x00p\x00\x00\x00g\x00\x00\x00'

Что я делаю неправильно при декодировании из tf.string?

Вызов .decode().replace('\x00', '') в вашей строке байтов производит «P_00148_RIGHT_MLO.jpg». Это что-то похожее на желаемое имя файла?

twolffpiggott 06.06.2018 16:42

Да, в самом деле! Это именно то имя файла, которое я искал.

Peter Lawrence 06.06.2018 16:54
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
578
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вызов .decode().replace('\x00', '') в вашей строке байтов производит «P_00148_RIGHT_MLO.jpg».

Добавление декодирования и замены в возвращаемой функции должно решить вашу проблему.

Другие вопросы по теме