Как вернуть размер пакета из набора данных tensorflow?

В качестве входного конвейера рекомендуется использовать набор данных 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). Может быть, кто-то захочет узнать, сколько пакетов в наборе данных или его итераторах. Или сколько пакетов было вызвано и сколько осталось в итераторе? Также может потребоваться получить определенные элементы или даже весь набор данных сразу.

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


person Miladiouss    schedule 19.04.2018    source источник


Ответы (3)


Попробуй это

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])
and you will see enter image description here

person guorui    schedule 19.04.2018

По крайней мере, в 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
person Yaoshiang    schedule 22.06.2021

В 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]

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

person ruancomelli    schedule 30.10.2020