Tensorflow: подсчитайте количество примеров в файле TFRecord — без использования устаревшего `tf.python_io.tf_record_iterator`

Пожалуйста, прочтите сообщение, прежде чем пометить его как дубликат.:

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

На StackOverflow есть несколько разных вопросов, которые отвечают на этот вопрос. Проблема в том, что все они, кажется, используют УСТАРЕВШУЮ команду tf.python_io.tf_record_iterator, так что это не стабильное решение. Вот пример существующих сообщений:

Получение общего количества записей из файла .tfrecords в Tensorflow

Количество примеров в каждой tfrecord

Количество примеров в каждой tfrecord

Поэтому мне было интересно, есть ли способ подсчитать количество записей с помощью нового API набора данных.

Udacity Nanodegree Capstone Project: Классификатор пород собак
Udacity Nanodegree Capstone Project: Классификатор пород собак
Вы можете ознакомиться со скриптами проекта и данными на github .
7
0
3 160
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Используя API набора данных, я настраиваю итератор, а затем перебираю его. Не уверен, что это самый быстрый, но он работает. УБЕДИТЕСЬ, ЧТО РАЗМЕР ПАКЕТА И ПОВТОР УСТАНОВЛЕНЫ НА 1, иначе код вернет количество пакетов, а не количество примеров в наборе данных.

count_test = tf.data.TFRecordDataset('testing.tfrecord')
count_test = count_test.map(_parse_image_function)
count_test = count_test.repeat(1)
count_test = count_test.batch(1)
test_counter = count_test.make_one_shot_iterator()

c = 0
for ex in test_counter:
    c += 1
f"There are {c} testing records"

Это, казалось, работало достаточно хорошо даже на относительно большом файле.

Ошибка 'BatchDataset' object has no attribute 'make_one_shot_iterator' вылетела. То же самое без .make_one_shot_iterator сработало для меня.

BCJuan 10.02.2021 19:31
Ответ принят как подходящий

В классе reduce есть метод Dataset. Они приводят пример подсчета записей по методу:

# generate the dataset (batch size and repeat must be 1, maybe avoid dataset manipulation like map and shard)
ds = tf.data.Dataset.range(5) 
# count the examples by reduce
cnt = ds.reduce(np.int64(0), lambda x, _: x + 1)

## produces 5

Не знаю, быстрее ли этот метод, чем цикл for @krishnab.

Следующее работает для меня с использованием TensorFlow версии 2.1 (используя код, найденный в этот ответ):

def count_tfrecord_examples(
        tfrecords_dir: str,
) -> int:
    """
    Counts the total number of examples in a collection of TFRecord files.

    :param tfrecords_dir: directory that is assumed to contain only TFRecord files
    :return: the total number of examples in the collection of TFRecord files
        found in the specified directory
    """

    count = 0
    for file_name in os.listdir(tfrecords_dir):
        tfrecord_path = os.path.join(tfrecords_dir, file_name)
        count += sum(1 for _ in tf.data.TFRecordDataset(tfrecord_path))

    return count

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