Как и в случае с pandas_df.shape, есть ли способ использовать tensorflow.data.Dataset? Спасибо.
Я не знаком с чем-то встроенным, но фигуры можно получить из атрибута Dataset._tensors
. Пример:
import tensorflow as tf
def dataset_shapes(dataset):
try:
return [x.get_shape().as_list() for x in dataset._tensors]
except TypeError:
return dataset._tensors.get_shape().as_list()
И использование:
from sklearn.datasets import make_blobs
x_train, y_train = make_blobs(n_samples=10,
n_features=2,
centers=[[1, 1], [-1, -1]],
cluster_std=0.5)
dataset = tf.data.Dataset.from_tensor_slices(x_train)
print(dataset_shapes(dataset)) # [10, 2]
dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
print(dataset_shapes(dataset)) # [[10, 2], [10]]
Спасибо за ответ. Я новичок в tf и изучаю/использую tf 2 alpha. Я не смог воспроизвести этот код в tf 2.0.
только что запустил в tf-2-alpha. Это работает. Какая у вас ошибка? Пожалуйста, опубликуйте это здесь
Хорошо, результат немного отличается от TF2. Для точного результата, который я представил здесь, используйте что-то вроде этого: def dataset_shapes(dataset): res = [x.get_shape().as_list() for x in dataset._tensors]; return res if len(res) > 1 else res[0]
Да, это работает для tf2. Но ваше решение не дает точной формы набора данных. Я использовал более простой набор данных: dataset2 = tf.data.Dataset.from_tensor_slices( {"a":tf.random.uniform([4]), "b":tf.random.uniform([4, 3], maxval=100, dtype=tf.int32 )})
, и он возвращает [[4], [4, 3]], но он должен возвращать [4,2], так как он имеет 4 строки и 2 столбца. Я использовал части вашего кода, чтобы получить размеры rows=dataset2._tensors[0].get_shape()[0]
cols=len(dataset2._tensors)
Однако эта функция не работает для tensorflow_datasets. Я применил его к mnist_train, но не сработало. dataset, info = tfds.load('mnist', data_dir='gs://tfds-data/datasets', with_info=True, as_supervised=True)
... mnist_train, mnist_test = dataset['train'], dataset['test']
(1) В своем вопросе вы не упомянули, что используете TF2. (2) Вы задали вопрос о tensorflow.data.Dataset
, а не о tensorflow_datasets
. (3) Я не могу предоставить решение для каждой возможной итерации, которую вы можете поместить в набор данных + Тривиально экстраполировать на другие случаи, если вы знаете, как извлекать фигуры из тензоров, и имеете небольшое знание Python.
Это решение не работает для меня в tf 2. Там написано, что _tensor не является атрибутом TakeDataset
или ShuffleDataset
Чтобы добавить к ответ Влада, на случай, если кто-то попробует это для наборов данных, загруженных через tfds, возможный способ — использовать информацию о наборе данных:
info.features['image'].shape # shape of 1 feature in dataset
info.features['label'].num_classes # number of classes
info.splits['train'].num_examples # number of training examples
Например. tf_flowers :
import tensorflow as tf
import tensorflow_datasets as tfds
dataset, info = tfds.load("tf_flowers", with_info=True) # download data with info
image_size = info.features['image'].shape # (None, None, 3)
num_classes = info.features['label'].num_classes # 5
data_size = info.splits['train'].num_examples # 3670
Например. fashion_mnist :
import tensorflow as tf
import tensorflow_datasets as tfds
dataset, info = tfds.load("fashion_mnist", with_info=True) # download data with info
image_size = info.features['image'].shape # (28, 28, 1)
num_classes = info.features['label'].num_classes # 10
data_splits = {k:v.num_examples for k,v in info.splits.items()} # {'test': 10000, 'train': 60000}
Надеюсь это поможет.
Метод output_shapes класса Dataset дает вам измерение каждой точки данных. Но поскольку API набора данных определяет итератор для доступа к вашим данным, я не думаю, что есть какой-либо способ узнать количество точек данных, которые у вас есть заранее. Могут быть закрытые переменные, которые содержат какое-то свойство, которое даст больше деталей, если мы посмотрим на исходный код.