Как получить размер пакета из набора данных 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.Dataset
s являются итерациями, поэтому вы можете получить пакет, просто выполнив:
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]
Обратите внимание, что итерация по набору данных требует активного выполнения. Более того, это решение предполагает, что ваш набор данных пакетирован, и в противном случае могут возникать ошибки. Вы также можете столкнуться с ошибками, если после пакетной обработки вы выполните другие операции с набором данных, которые изменят форму его элементов.