Получен несоответствующий результат между записью и чтением файлов tfrecord - PullRequest
0 голосов
/ 31 октября 2018

Здесь я использую эту функцию для записи нескольких файлов tfrecord:

writer = tf.python_io.TFRecordWriter(save)
for pth, lb in tqdm(zip(piece_p, piece_l)):
    # mind that the path should be read into image data first
    # to convert the byteslist data format into raw bytes
    data = Image.open(pth)
    if resize is not None:
        data.thumbnail(resize, Image.ANTIALIAS)
    features = tf.train.Features(feature={
        'image': tf.train.Feature(
            bytes_list=tf.train.BytesList(value=[data.tobytes()])),
        'label': tf.train.Feature(
            int64_list=tf.train.Int64List(value=[lb]))
    })
    example = tf.train.Example(features=features)

    # serialize the constructed data format before writing step
    writer.write(example.SerializeToString())
    sys.stdout.flush()
writer.close()

И проанализируйте двоичный файл, используя код как показано ниже:

def parse_fn(serialized):
    features = {
        'image': tf.FixedLenFeature([], tf.string),
        'label': tf.FixedLenFeature([], tf.int64)
    }
    parse_exp = tf.parse_single_example(serialized=serialized,
                                    features=features)
    labels = parse_exp['label']
    data = parse_exp['image']
    data = tf.decode_raw(data, tf.uint8)
    data = tf.cast(data, tf.float32)
    del parse_exp
    return data, labels

dataset = tf.data.Dataset.list_files(data_list, shuffle=True)
dataset = dataset.interleave(tf.data.TFRecordDataset,
                             cycle_length=file_num)
# dataset = tf.data.TFRecordDataset(data_list[0])

dataset = dataset.map(parse_fn, num_parallel_calls=4)

Но почему количество меток и данных всегда не совпадают ...? каждый раз при добавлении следующего кода, чтобы сделать несколько пакетов или STH

dataset = dataset.batch(12)
dataset = dataset.repeat(1)
iterator = dataset.make_initializable_iterator()
sess = tf.Session()
sess.run(tf.global_variables_initializer())
sess.run(iterator.initializer)
data, labels = iterator.get_next()

и количество этикеток всегда остается половиной данных. что-то не так с настройкой моих аргументов? Я почти уверен, что нет ничего плохого в том, что я сохраняю и читаю отдельно, но есть некоторые проблемы при их объединении.

...