Как получить количество строк, столбцов/размеров tensorflow.data.Dataset?

Как и в случае с pandas_df.shape, есть ли способ использовать tensorflow.data.Dataset? Спасибо.

Метод output_shapes класса Dataset дает вам измерение каждой точки данных. Но поскольку API набора данных определяет итератор для доступа к вашим данным, я не думаю, что есть какой-либо способ узнать количество точек данных, которые у вас есть заранее. Могут быть закрытые переменные, которые содержат какое-то свойство, которое даст больше деталей, если мы посмотрим на исходный код.

kvish 10.04.2019 20:32
Udacity Nanodegree Capstone Project: Классификатор пород собак
Udacity Nanodegree Capstone Project: Классификатор пород собак
Вы можете ознакомиться со скриптами проекта и данными на github .
4
1
1 707
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я не знаком с чем-то встроенным, но фигуры можно получить из атрибута 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.

Neo 11.04.2019 19:48

только что запустил в tf-2-alpha. Это работает. Какая у вас ошибка? Пожалуйста, опубликуйте это здесь

Vlad 11.04.2019 19:52

Хорошо, результат немного отличается от 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]

Vlad 11.04.2019 20:11

Да, это работает для 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)

Neo 11.04.2019 20:40

Однако эта функция не работает для 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']

Neo 11.04.2019 20:46

(1) В своем вопросе вы не упомянули, что используете TF2. (2) Вы задали вопрос о tensorflow.data.Dataset, а не о tensorflow_datasets. (3) Я не могу предоставить решение для каждой возможной итерации, которую вы можете поместить в набор данных + Тривиально экстраполировать на другие случаи, если вы знаете, как извлекать фигуры из тензоров, и имеете небольшое знание Python.

Vlad 11.04.2019 20:53

Это решение не работает для меня в tf 2. Там написано, что _tensor не является атрибутом TakeDataset или ShuffleDataset

Paul 22.10.2021 01:13

Чтобы добавить к ответ Влада, на случай, если кто-то попробует это для наборов данных, загруженных через 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}

Надеюсь это поможет.

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

Как передать несколько наборов временных рядов в модель LSTM для прогнозирования?
Как выполнить выбор функций с помощью gridsearchcv в sklearn в python
Как получить функцию решения в randomforest в sklearn
Точность, которую выводит генератор подгонки в Keras, отличается от точности, рассчитанной вручную
Недопустимая ошибка формы при использовании Knn Classfier
Есть ли другая альтернатива для получения ImageView и преобразования его в растровое изображение для классификации изображений в Android?
Как выполнить GridSearchCV с перекрестной проверкой в ​​python
Как я могу решить «Ошибку значения», в которой говорится, что не удалось преобразовать строку в число с плавающей запятой: «D»?
Какие ресурсы я должен изучить, чтобы рассчитать размер моего ядра?
«ValueError: не удалось преобразовать строку в число с плавающей запятой» при использовании OneHotEncoder для машинного обучения