Как получить размер пакета из набора данных tenorflow?

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

# Specify dataset
dataset  = tf.data.Dataset.from_tensor_slices((features, labels))
# Suffle
dataset  = dataset.shuffle(buffer_size=1e5)
# Specify batch size
dataset  = dataset.batch(128)
# Create an iterator
iterator = dataset.make_one_shot_iterator()
# Get next batch
next_batch = iterator.get_next()

Я должен быть в состоянии получить размер пакета (либо из самого набора данных или из итератора, созданного из него, т.е. оба iterator а также next_batch). Может быть, кто-то хочет знать, сколько пакетов есть в наборе данных или его итераторах. Или сколько пакетов было вызвано и сколько осталось в итераторе? Можно также захотеть получить определенные элементы или даже весь набор данных одновременно.

Я не смог ничего найти в документации по тензорному потоку. Это возможно? Если нет, кто-нибудь знает, если это было запрошено как проблема на GitHub tenorflow?

4 ответа

Вы сами указали размер партии, сказавdataset.batch(128), Есть 128 примеры в вашей партии.

Попробуй это

import tensorflow as tf
import numpy as np

features=np.array([[3.0, 0.0], [1.0, 2.0], [0.0, 0.0]], dtype="float32")
labels=np.array([[0], [0], [1]], dtype="float32")
dataset = tf.data.Dataset.from_tensor_slices((features, labels))

batch_size = 2
dataset = dataset.batch(batch_size)
iterator = dataset.make_initializable_iterator()
batch_data = iterator.get_next()
with tf.Session() as sess:
    sess.run(iterator.initializer)
    print(np.shape(sess.run(batch_data)[0])[0])
и ты увидишь

По крайней мере, в TF2 тип набора данных определяется статически и доступен через tf.data.Dataset.element_spec.

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

      >>> tf.data.Dataset.from_tensor_slices([[[1]],[[2]]]).element_spec.shape
TensorShape([1, 1])

Если ваши данные организованы как кортеж [image, label], то вы получите кортеж TensorSpecs. Вы можете проиндексировать его, если уверены в вложенности возвращаемого типа. Например

      >>> image = tf.data.Dataset.from_tensor_slices([[1],[2],[3],[4]]).batch(2, drop_remainder=True)
>>> label = tf.data.Dataset.from_tensor_slices([[1],[2],[3],[4]]).batch(2, drop_remainder=True)
>>> train = tf.data.Dataset.zip((image, label))
>>> train.element_spec[0].shape[0]
2

В TF2 tf.data.Datasets являются итерациями, поэтому вы можете получить пакет, просто выполнив:

batch = next(iter(dataset))

а затем вычислить размер партии тривиально, так как он становится размером первого измерения:

batch_size = batch.shape[0]

Полный пример будет выглядеть так:

# Specify dataset
dataset  = tf.data.Dataset.from_tensor_slices((features, labels))
# Suffle
dataset  = dataset.shuffle(buffer_size=1e5)
# Specify batch size
dataset  = dataset.batch(128)
# Calculate and print batch size
batch_size = next(iter(dataset)).shape[0]
print('Batch size:', batch_size) # prints 128

Или, если вам это нужно как функция:

def calculate_batch_size(dataset):
    return next(iter(dataset)).shape[0]

Обратите внимание, что итерация по набору данных требует активного выполнения. Более того, это решение предполагает, что ваш набор данных пакетирован, и в противном случае могут возникать ошибки. Вы также можете столкнуться с ошибками, если после пакетной обработки вы выполните другие операции с набором данных, которые изменят форму его элементов.

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